如何从Python代码中进入REPL(Read, Eval, Print, Loop)?

137
有没有一种方法可以在Python脚本执行的任意时刻强制程序进入REPL?即使该脚本是通过命令行启动的。
我正在编写一个快速粗糙的绘图程序,希望从标准输入或文件中读取数据,绘制它,然后进入REPL以允许对绘图进行自定义。
8个回答

152

我经常使用这个:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()

55
你甚至可以更简单地做到这一点:导入code模块; code.interact(local=locals())。 - Steven Kryskalla
5
pdb中,您可以使用interact - gerrit

132

你可以尝试使用Python的交互式选项:

python -i program.py

这将执行program.py中的代码,然后进入REPL。在program.py的顶层定义或导入的任何内容都将可用。


26
当你准备好转投“黑暗面”时,ipython -i program.py 可以帮助你。 - joeforker

51

以下是应该如何处理的方式(IPython > v0.11):

import IPython
IPython.embed()

对于 IPython <= v0.11:

from IPython.Shell import IPShellEmbed

ipshell = IPShellEmbed()

ipshell() # this call anywhere in your program will start IPython

你应该使用IPython,这是Python REPL的豪华版。请查看http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

根据文档:

在科学计算环境中,IPython也非常有用。通常需要进行一些自动的、计算密集型的操作,然后停下来查看数据、图形等。打开一个IPython实例将为您提供对数据和函数的完全访问权限,您可以在交互部分完成后恢复程序执行(也许稍后再次停止,如需要多次执行)。


4
IPython很棒,但如果OP想要一个只使用内置Python的解决方案,Jason的code.InteractiveConsole()解决方案是你应该采用的方式。 :-) - Ben Hoyt
这是我在代码中放置任意位置时,唯一能够实际读取本地变量的方法。 - corazza
有没有办法在ipython repl中停止脚本?我已经将对embed()的调用放在了一个紧密的循环中! - kristianp
IPython相对于code模块有什么不同或优势? - Erich

19

你可以启动调试器:

import pdb;pdb.set_trace() 

不确定你想要REPL做什么,但调试器非常相似。


4
他可能希望像Lisp那样对正在运行的进程进行实时修改。 - Pinochle
1
有没有办法恢复执行将您带入pdb的脚本? - Jeff Welling
1
我倾向于在VIM中编写代码片段,而不是在Python中保存它,然后执行!python -i%,或者使用pdb。这是一个很好的用例。 - Nishant
自Python 3.7起,您可以调用内置函数breakpoint()来实现相同的效果。 - Jasha
@JeffWelling pdb文档提供了更详细的答案,但是continue可用于恢复。 c是一个缩写替代。 - Erich

18

如果你想使用iPython和调试器的功能,你应该使用ipdb

你可以像使用pdb一样使用它,只是多了一些功能:

import ipdb
ipdb.set_trace()

1

我刚刚在自己的脚本中完成了这个操作(它运行在一个非常难以操纵的自动化框架内):

x = 0 # exit loop counter
while x == 0:
    user_input = raw_input("Please enter a command, or press q to quit: ")
    if user_input[0] == "q":
        x = 1
    else:
        try:
            print eval(user_input)
        except:
            print "I can't do that, Dave."
            continue

只需要将这个断点放在任何需要的地方,你就可以使用与Python解释器相同的语法来检查状态(尽管它似乎不允许你进行模块导入)。 它并不是非常优雅,但不需要任何其他设置。


0

以上的答案都很好,但如果您想在您的IDE中使用此功能。使用Visual Studio Code(v1.5.*)和Python Setup

  1. 突出显示您想要运行的行并
  • 右键单击并从下拉菜单中选择在交互式窗口中运行选择/行
  • 按下键盘上的shift + enter

enter image description here

  1. 在文件浏览器中右键单击要执行的 Python 文件,然后选择 在交互式窗口中运行当前文件

enter image description here

这将启动一个交互式会话,具有代码检查、代码补全和语法高亮功能:

enter image description here

enter image description here

输入您想要评估的代码,然后在键盘上按下shift + enter以执行。

享受Python吧!


1
这是美丽的“泪滴”。如果有什么比IPython REPL更有用的东西,那就是Jupyter Notebook。如果您选择并“shift+enter”每个部分,您可以逐部执行脚本。如果您不想使用鼠标,Visual Vim选择功能非常好用。我必须在我的键绑定中否定"-python.execSelectionInTerminal",并将其复制为"jupyter.execSelectionInteractive",以便代码在笔记本中运行而不是在终端中运行。 - Chema

0
这个函数使用调用者的本地变量和全局变量执行code.interact函数。
def repl():
    """This starts a REPL with the callers globals and locals available

    Raises:
        RuntimeError: Is raised when the callers frame is not available
    """
    import code
    import inspect

    frame = inspect.currentframe()
    if not frame:
        raise RuntimeError('No caller frame')

    code.interact(local=dict(frame.f_back.f_globals, **frame.f_back.f_locals))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接