[英]Enter Interactive Mode In Python
我正在运行我的 Python 程序,并且有一点需要跳进去看看发生了什么,然后再退出。 有点像临时控制台模式。
在 Matlab 中,我会使用keyboard
命令来执行此操作,但我不确定 python 中的命令是什么。
有没有办法做到这一点?
例如:
for thing in set_of_things:
enter_interactive_mode_here()
do_stuff_to(thing)
当enter_interactive_mode()
调用时,我想去那里,环顾四周,然后离开并让程序继续运行。
code.interact()
似乎以某种方式工作:
>>> import code
>>> def foo():
... a = 10
... code.interact(local=locals())
... return a
...
>>> foo()
Python 3.6.5 (default, Apr 1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> a
10
Ctrl + Z返回到“主”解释器。
你可以阅读当地人,但修改他们似乎并没有这样工作。
python -i myapp.py
这将执行myapp.py
并将您放入交互式 shell。 从那里你可以执行函数并检查它们的输出,加载myapp.py
的整个环境(导入等)。
对于更复杂的东西 - 最好使用像pdb
这样的调试器,设置断点。 此外,大多数 IDE(PyDev、PyCharm、Komodo...)都有图形调试器。
为此,我使用pdb
。 我知道 Emil 已经在他的回答中提到了这一点,但他没有提供示例或详细说明为什么它可以回答您的问题。
for thing in set_of_things:
import pdb; pdb.set_trace()
do_stuff_to(thing)
您可以通过以感叹号开始命令来读取和设置变量。 您还可以在堆栈中上下移动(命令u
和d
), InteractiveConsole
没有内置机制可以执行此操作。
要让程序继续执行,请使用c
命令。 在上面的示例中,它会在每次循环迭代时进入调试器,因此您可能希望将set_trace()
调用包装在if
语句中。
您有多种选择——Python 标准库或 IPython。
Python 标准库有一个code
模块,它有一个InteractiveConsole
类,其目的是“密切模拟交互式 Python 解释器的行为”。 这可能可以做你想做的事,但文档没有任何关于如何使用它的例子,我也没有关于去哪里的任何建议。
IPython是一个更高级的 Python 终端,可以选择在内置程序的任何位置嵌入控制台。根据他们的文档,您可以简单地做
from IPython import embed
for thing in set_of_things:
embed()
do_stuff_to(thing)
从 Python 3.7 开始,您还可以使用breakpoint()
进入调试器,例如:
for thing in set_of_things:
breakpoint()
do_stuff_to(thing)
这样更容易记忆和编写,默认情况下会在 pdb 中打开你的代码。
但是,也可以将PYTHONBREAKPOINT
环境设置为可调用的名称,它可以是另一个调试器,例如pudb
或ipdb
,也可以是 IPython 的embed
,或其他任何东西。
对我来说最舒服的工具是ipdb 。
ipdb 导出函数以访问 IPython 调试器,它具有制表符完成、语法突出显示、更好的回溯、更好的内省功能,与 pdb 模块具有相同的接口。
完成和方便的内省对于调试特别有用。
您可以使用ipdb
。
要设置断点,请添加
import ipdb; ipdb.set_trace()
import ipdb; ipdb.set_trace()
你想跳转到调试器的地方。 到达断点后,您将获得一个交互式 shell 和断点周围的几行代码以获取上下文。https://www.safaribooksonline.com/blog/2014/11/18/intro-python-debugger/
虽然它可能不是最合适的选择,但有些简单:
try:
while True:
print input()
except:
pass
将涵盖许多案件
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.