125

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

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

4

7 回答 7

144

我经常使用这个:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()
于 2009-09-08T21:18:44.980 回答
113

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

python -i program.py

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

于 2009-09-08T20:34:12.070 回答
49

下面是你应该怎么做(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

您应该使用 Python REPL 的凯迪拉克 IPython。请参阅http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

从文档中:

它在科学计算情况下也很有用,在这种情况下,通常需要执行一些自动的、计算密集型的部分,然后停下来查看数据、绘图等。打开 IPython 实例将使您可以完全访问您的数据和函数,完成交互部分后,您可以恢复程序执行(可能稍后再停止,根据需要多次停止)。

于 2009-09-08T20:31:58.887 回答
18

您可以启动调试器:

import pdb;pdb.set_trace() 

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

于 2009-09-08T19:42:26.763 回答
18

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

您可以像使用 pdb 一样使用它,只需添加:

import ipdb
ipdb.set_trace()
于 2009-09-08T21:48:45.433 回答
1

我只是在我自己的一个脚本中做到了这一点(它在一个自动化框架内运行,这是一个巨大的 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 解释器相同的语法检查状态(尽管它似乎不允许您进行模块导入)。它不是很优雅,但不需要任何其他设置。

于 2014-03-12T01:01:18.720 回答
1

上面的答案很好,但是如果您想在IDE中使用此功能。将Visual Studio Code (v1.5.*) 与Python 设置一起使用:

  1. 突出显示您要运行的行并
  • right clickRun Selection/Line in Interactive Window从下拉列表中选择。
  • 按下shift + enter键盘。

在此处输入图像描述

  1. 在文件资源管理器中右键单击Python要执行的文件并选择Run Current File in Interactive Window

在此处输入图像描述

这将启动一个交互式会话,其中包含 linting、代码完成和语法高亮:

在此处输入图像描述

在此处输入图像描述

输入您要评估的代码,然后敲击shift + enter键盘执行。

享受 Python!

于 2021-06-19T09:20:28.267 回答