在Python中进入交互模式

70

我正在运行我的Python程序,在某个点上,可以跳进去看一下发生了什么,然后再跳出来。有点像一个临时的控制台模式。

在Matlab中,我会使用 keyboard 命令来实现这个功能,但我不知道在Python中该怎么做。

有没有办法做到这一点?

例如:

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

当调用 enter_interactive_mode() 函数时,我想进入其中,查看周围情况,然后离开并让程序继续运行。


1
请查看code.InteractiveInterpreter类,然后总有exec - martineau
1
你能否不在你的集成开发环境中使用断点吗? - Cal McLean
7个回答

72

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

你可以查看本地变量,但是以这种方式修改它们似乎不起作用。


在IDLE中,由于Ctrl+Z返回到主解释器而不是程序,因此这并不比sys.exit()更有效。 - Noumenon
另一个答案中有一段带有代码的例子。InteractiveConsole.interact() 似乎更好用 - 它使用 readline 并具有 tab 补全功能。(https://stackoverflow.com/questions/50917938/enabling-console-features-with-code-interact)。按 Ctrl+D 可以退出交互式会话。 - HKOB
CTRL-Z将作业放到后台。 - wsdzbm

64
python -i myapp.py
这将执行myapp.py并将您放置在交互式shell中。从那里,您可以执行函数并检查它们的输出,同时装入myapp.py的整个环境(导入等)。
对于更复杂的操作 - 最好使用像pdb这样的调试器设置断点。此外,大多数IDE(PyDev、PyCharm、Komodo...)都有图形化调试器。

5
恐怕这并没有回答我的问题。在执行完“myapp.py”后,它会进入交互模式;我希望在执行“myapp.py”期间进入交互模式。 - Richard
1
你的选择要么是使用调试器,要么创建一个脚本,执行到你感兴趣的点。从那里开始,你可以调用一个函数来“恢复”你的程序。 - Emil Ivanov

19

我为此目的使用pdb。我意识到Emil已经在他的答案中提到了这一点,但他没有包含示例或详细说明为什么它回答了你的问题。

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

在命令前加上感叹号,您可以读取和设置变量。而且,您还可以上下移动堆栈(命令ud),InteractiveConsole没有内置机制来执行此操作。

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


2
基本上,set_trace 命令将控制权交给键盘。 - Charlie Parker

14
您有两个选择——Python标准库或IPython。
Python标准库有一个名为code的模块,其中包含一个InteractiveConsole类,其目的是“紧密模拟交互式Python解释器的行为。”这可能能够满足您的需求,但文档中没有任何关于如何使用它的示例,我也没有任何建议。 IPython是一个更高级的Python终端,可以在程序中的任何位置嵌入控制台。根据他们的documentation,您只需执行以下操作:
from IPython import embed

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

7

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

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

这种方法更容易记忆和书写,并且默认情况下会在pdb中打开您的代码。

但是,也可以将PYTHONBREAKPOINT环境变量设置为可调用的名称,这可以是另一个调试器,比如pudbipdb,或者是IPython的embed或其他任何内容。


4

更好的答案,因为您可以访问本地变量。 - pryma

4

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

ipdb导出功能以访问IPython调试器,该调试器具有选项卡完成、语法突出显示、更好的跟踪、更好的内省以及与pdb模块相同的接口。

完成和方便的内省对于调试尤其有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接