203

所以我正在运行一个 Python 脚本,在该脚本中我通过编写以下代码调用 Python 的调试器 PDB:

import ipdb; ipdb.set_trace()

(iPython 的 PDB 版本,虽然我认为它没有区别;我只将它用于彩色输出)。

现在,当我到达调试器时,我想执行一个多行语句,例如 if 子句或 for 循环,但只要我输入

if condition:

并按回车键,我收到错误消息*** SyntaxError: invalid syntax (<stdin>, line 1)

如何在 PDB 中执行多行语句?如果不可能,是否有办法解决这个问题,仍然执行 if 子句或 for 循环?

4

6 回答 6

303

您可以在 pdb 中执行此操作,以启动一个包含所有可用局部变量的临时交互式 Python 会话:

(pdb) !import code; code.interact(local=vars())
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> 

完成后,使用 Ctrl-D 返回到常规 pdb 提示符。

只是不要按 Ctrl-C,这将终止整个 pdb 会话。

于 2011-12-05T15:16:03.270 回答
122

在 python3 ipdb(and pdb) 中有一个名为interact的命令。它可用于:

启动一个交互式解释器(使用代码模块),其全局命名空间包含在当前范围内找到的所有(全局和本地)名称。

要使用它,只需interact在 pdb 提示符下输入。除此之外,它对于应用跨越多行的代码以及避免意外触发其他 pdb 命令很有用。

于 2017-05-15T21:20:34.383 回答
54

我的建议是使用 IPython 嵌入。

ipdb> from IPython import embed; embed()
于 2018-04-03T06:56:13.073 回答
36

在 Python (2.7.1) 解释器或调试器 (import pdb) 中,您可以使用以下语法执行多行语句。

for i in range(5): print("Hello"); print("World"); print(i)

注意:当我在解释器中时,我必须在代码执行之前按两次 return。然而,在调试器内部,我只需要按一次 return。

于 2011-05-11T16:33:08.990 回答
7

如果您希望在遇到断点时执行几个命令,则存在特殊情况。然后是调试器命令commandsend它允许您输入多行命令,然后用关键字结束整个序列。更多与(pdb) help commands

于 2011-05-11T17:16:30.510 回答
2

我不知道你能不能做到这一点,不过这对 ipdb 来说是一个很棒的功能。您当然可以使用列表推导,并执行简单的多行表达式,例如:

if y == 3: print y; print y; print y;

您还可以事先编写一些函数来执行您需要完成的通常需要多行的操作。

于 2011-05-11T16:18:28.180 回答