我正在运行我的Python程序,并且有一个重点是跳入并查看正在发生的事情,然后再次退出。有点像临时控制台模式。
在Matlab中,我使用keyboard
命令来执行此操作,但我不确定python中的命令是什么。
有办法做到这一点吗?
例如:
for thing in set_of_things:
enter_interactive_mode_here()
do_stuff_to(thing)
当enter_interactive_mode()
来电时,我想去那里,环顾四周,然后离开并让程序继续运行。
答案 0 :(得分:51)
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 返回“主”解释器。
您可以阅读本地人,但修改它们似乎不会这样。
答案 1 :(得分:45)
python -i myapp.py
这将执行myapp.py
并将您放入交互式shell中。从那里你可以执行函数并检查它们的输出,加载myapp.py
的整个环境(导入等)。
对于更复杂的东西 - 最好使用像pdb
这样的调试器来设置断点。此外,大多数IDE(PyDev,PyCharm,Komodo ......)都有图形化调试器。
答案 2 :(得分:17)
我为此目的使用pdb
。我意识到埃米尔已经在他的回答中提到了这一点,但他没有提供一个例子或详细说明为什么它会回答你的问题。
for thing in set_of_things:
import pdb; pdb.set_trace()
do_stuff_to(thing)
您可以通过使用感叹号启动命令来读取和设置变量。您还可以在堆栈中上下移动(命令u
和d
),InteractiveConsole
没有内置机制。
要让程序继续执行,请使用c
命令。在上面的示例中,它将在每次循环迭代时进入调试器,因此您可能希望将set_trace()
调用包装在if
句中。
答案 3 :(得分:10)
你有选择 - Python标准库或IPython。
Python标准库有一个code
模块,它有一个InteractiveConsole
类,其目的是“密切模拟交互式Python解释器的行为”。这可能会做你想要的,但文档没有任何关于如何使用它的例子,我没有任何关于去哪里的建议。
IPython,这是一个更高级的Python终端,可以选择在你内置的程序中的任何一点嵌入一个控制台。根据他们的documentation,你可以简单地做到
from IPython import embed
for thing in set_of_things:
embed()
do_stuff_to(thing)
答案 4 :(得分:4)
答案 5 :(得分:3)
您可以使用ipdb
。
要设置断点,请将
import ipdb; ipdb.set_trace()
添加到要跳转到调试器的位置。一旦到达断点,您将获得一个交互式shell和断点周围的几行代码以供上下文使用。https://www.safaribooksonline.com/blog/2014/11/18/intro-python-debugger/
答案 6 :(得分:0)
虽然它可能不是最合适的选择,但有些简单:
try:
while True:
print input()
except:
pass
将涵盖许多案例
答案 7 :(得分:0)
从Python 3.7开始,您还可以使用breakpoint()
进入调试器,例如:
for thing in set_of_things:
breakpoint()
do_stuff_to(thing)
这更容易记住和编写,并且默认情况下会在pdb中打开您的代码。
但是,也可以将PYTHONBREAKPOINT
环境设置为可调用的名称,该环境可以是诸如pudb
或ipdb
之类的另一个调试器,也可以是IPython的{{ 1}}或其他任何内容。