有没有一种方法可以在Python脚本执行的任意时刻强制程序进入REPL?即使该脚本是通过命令行启动的。
我正在编写一个快速粗糙的绘图程序,希望从标准输入或文件中读取数据,绘制它,然后进入REPL以允许对绘图进行自定义。
我正在编写一个快速粗糙的绘图程序,希望从标准输入或文件中读取数据,绘制它,然后进入REPL以允许对绘图进行自定义。
我经常使用这个:
def interact():
import code
code.InteractiveConsole(locals=globals()).interact()
你可以尝试使用Python的交互式选项:
python -i program.py
这将执行program.py中的代码,然后进入REPL。在program.py的顶层定义或导入的任何内容都将可用。
以下是应该如何处理的方式(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实例将为您提供对数据和函数的完全访问权限,您可以在交互部分完成后恢复程序执行(也许稍后再次停止,如需要多次执行)。
embed()
的调用放在了一个紧密的循环中! - kristianpcode
模块有什么不同或优势? - Erich你可以启动调试器:
import pdb;pdb.set_trace()
不确定你想要REPL做什么,但调试器非常相似。
breakpoint()
来实现相同的效果。 - Jasha我刚刚在自己的脚本中完成了这个操作(它运行在一个非常难以操纵的自动化框架内):
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解释器相同的语法来检查状态(尽管它似乎不允许你进行模块导入)。 它并不是非常优雅,但不需要任何其他设置。
以上的答案都很好,但如果您想在您的IDE中使用此功能。使用Visual Studio Code(v1.5.*)和Python Setup:
右键单击
并从下拉菜单中选择在交互式窗口中运行选择/行
。shift + enter
。Python
文件,然后选择 在交互式窗口中运行当前文件
这将启动一个交互式会话,具有代码检查、代码补全和语法高亮功能:
输入您想要评估的代码,然后在键盘上按下shift + enter
以执行。
享受Python吧!
"-python.execSelectionInTerminal"
,并将其复制为"jupyter.execSelectionInteractive"
,以便代码在笔记本中运行而不是在终端中运行。 - Chemacode.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))
pdb
中,您可以使用interact
。 - gerrit