64

我正在运行我的 Python 程序,并且有一个要点,那就是跳进去看看发生了什么,然后再跳出来。有点像临时控制台模式。

在 Matlab 中,我会使用keyboard命令来执行此操作,但我不确定 python 中的命令是什么。

有没有办法做到这一点?

例如:

for thing in set_of_things:
    enter_interactive_mode_here()
    do_stuff_to(thing)

打电话时enter_interactive_mode(),我想去那里,环顾四周,然后离开,让程序继续运行。

4

7 回答 7

67

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返回“主”解释器。

您可以阅读当地人,但修改它们似乎并不能以这种方式工作。

于 2012-11-17T17:22:08.357 回答
58
python -i myapp.py

这将执行myapp.py并将您放入交互式外壳中。myapp.py从那里您可以执行函数并检查它们的输出,并加载整个环境(导入等) 。

对于更复杂的东西 - 最好使用调试器pdb,例如设置断点。此外,大多数 IDE(PyDev、PyCharm、Komodo...)都有图形调试器。

于 2012-11-17T17:07:47.560 回答
18

pdb用于此目的。我意识到埃米尔已经在他的回答中提到了这一点,但他没有举一个例子或详细说明它为什么回答你的问题。

for thing in set_of_things:
    import pdb; pdb.set_trace()
    do_stuff_to(thing)

您可以通过以感叹号开头的命令来读取和设置变量。您还可以在堆栈上上下移动(命令ud),这InteractiveConsole没有内置机制要做。

要让程序继续执行,请使用c命令。在上面的示例中,它将在每次循环迭代时进入调试器,因此您可能希望将set_trace()调用包装在一个if句子中。

于 2012-11-17T18:02:23.753 回答
13

您可以选择——Python 标准库或 IPython。

Python 标准库有一个code模块,该模块有一个InteractiveConsole类,其目的是“密切模拟交互式 Python 解释器的行为”。这可能可以做你想做的事,但是文档没有任何关于如何使用它的示例,我也没有任何关于去哪里的建议。

IPython是一个更高级的 Python 终端,可以选择在内置程序的任何位置嵌入控制台。根据他们的文档,你可以简单地做

from IPython import embed

for thing in set_of_things:
  embed()
  do_stuff_to(thing)
于 2012-11-17T17:23:55.290 回答
4

对我来说最舒服的工具是ipdb

ipdb 导出函数以访问 IPython 调试器,该调试器具有制表符补全、语法高亮、更好的回溯、更好的自省以及与 pdb 模块相同的界面。

完成和方便的内省对于调试特别有用。

于 2012-11-17T19:20:45.493 回答
4

您可以使用ipdb.

要设置断点,请添加import ipdb; ipdb.set_trace()要跳转到调试器的位置。到达断点后,您将获得一个交互式 shell 和围绕断点的几行代码作为上下文。

https://www.safaribooksonline.com/blog/2014/11/18/intro-python-debugger/

于 2016-04-07T12:40:09.967 回答
3

从 Python 3.7 开始,您还可以使用breakpoint()进入调试器,例如:

for thing in set_of_things:
    breakpoint()
    do_stuff_to(thing)

这更容易记住和编写,默认情况下会在 pdb 中打开你的代码。

但是,也可以将PYTHONBREAKPOINT环境设置为可调用的名称,它可以是另一个调试器,例如pudbor ipdb,也可以是 IPython 的embed,或其他任何东西。

于 2020-05-08T18:40:50.907 回答