如何从Python代码放入REPL(读取,评估,打印,循环)


108

有没有办法以编程方式强制Python脚本在执行过程中的任意点放入REPL,即使该脚本是从命令行启动的也是如此?

我正在编写一个快速而肮脏的绘图程序,我想从stdin或文件中读取数据,对其进行绘图,然后放入REPL中以允许对绘图进行自定义。

Answers:


104

您可以尝试使用python的交互式选项:

python -i program.py

这将执行program.py中的代码,然后转到REPL。您在program.py顶层中定义或导入的所有内容都将可用。


21
当您准备切换到阴暗的一面时,ipython -i program.py就在那里。
joeforker

印象深刻而简单。
Nishant 2014年

126

我经常使用这个:

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

47
您可以做的比这更简单:导入代码;code.interact(local = locals())
Steven Kryskalla 09年

3
在其中pdb,您可以使用interact
格里特

43

这是您的操作方法(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实例将为您提供对数据和函数的完全访问权限,并且您可以在完成交互式部分的操作后继续执行程序(也许以后可以根据需要多次停止)。


3
IPython很棒,但是如果OP想要一个仅使用内置Python的解决方案,那么Jason的code.InteractiveConsole()解决方案就是您“应该”做到的方式。:-)
Ben Hoyt

18

要使用iPython和调试器功能,您应该使用ipdb

您可以使用与pdb相同的方式来使用它,除了:

import ipdb
ipdb.set_trace()

17

您可以启动调试器:

import pdb;pdb.set_trace() 

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


3
我怀疑他想对运行中的进程进行实时更改,例如Lasp。
Pinochle

1
有什么方法可以恢复执行将您启动到pdb的脚本?
杰夫·韦林

1
我倾向于在使用Python的VIM中编写代码片段,然后将其保存,然后执行!python -i%。或pdb。那是一个很好的用例。
Nishant 2014年

0

我只是在自己的一个脚本中执行了此操作(它在自动化框架中运行,这是一个需要检测的巨大PITA):

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解释器相同的语法检查状态(尽管似乎不允许您进行模块导入)。它不是很优雅,但是不需要任何其他设置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.