如何在 Python 自己的调试器 (PDB) 中执行多行语句
Posted
技术标签:
【中文标题】如何在 Python 自己的调试器 (PDB) 中执行多行语句【英文标题】:How to execute multi-line statements within Python's own debugger (PDB) 【发布时间】:2011-08-23 11:02:17 【问题描述】:所以我正在运行一个 Python 脚本,我在其中调用 Python 的调试器 PDB,方法是:
import ipdb; ipdb.set_trace()
(iPython 的 PDB 版本,尽管我认为它没有区别;我只将它用于彩色输出)。
现在,当我进入调试器时,我想执行一个多行语句,例如 if 子句或 for 循环,但只要我输入
if condition:
然后按回车键,我收到错误消息*** SyntaxError: invalid syntax (<stdin>, line 1)
如何在 PDB 中执行多行语句?如果不可能,有没有办法解决这个问题,仍然执行 if 子句或 for 循环?
【问题讨论】:
【参考方案1】:我的建议是使用 IPython 嵌入。
ipdb> from IPython import embed; embed()
【讨论】:
如果您在列表理解中遇到 value is not defined 错误,请尝试使用 IPythonimport embed; embed(user_ns=locals())
。
这对我来说比接受的答案要好得多。例如 - 它允许正确编辑多行 - 例如返回几行并修复某些内容,因此您不必再次重写整个多行表达式...我将本地人传递为 @fx-kirin建议。【参考方案2】:
在 python3 中ipdb
(和pdb
)有一个名为interact 的命令。它可以用于:
启动一个交互式解释器(使用 code 模块),其全局命名空间包含在当前范围内找到的所有(全局和本地)名称。
要使用它,只需在 pdb 提示符处输入 interact
。除此之外,它对于应用跨越多行的代码以及避免意外触发其他 pdb 命令很有用。
【讨论】:
这样做时它给了我“NameError: name 'interact' is not defined”。 @jason 3.2 或更高版本 这就解释了。我在 python 2.7 中。 小心这实际上引发了一个错误,交互可能未定义并退出进程 我认为建议避免使用interact
是一个过于强烈的建议。 90% 这就是我所需要的,而且打字比from IPython import embed; embed()
容易得多@【参考方案3】:
您可以在 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 会话。
【讨论】:
使用 pdbinteract
命令(as I learned from this bug tracker message)似乎也可以实现。
为什么import
语句中需要!
?
可能不需要,但我有一个习惯,就是在pdb中所有的Python语句前加上!
,以免发生意外。例如。 pdb 中的c = 42
将继续 执行,而不是分配给变量c
。
@MariusGedminas PDB 最令人沮丧的事情!如果他们的命令必须加上前缀会很好......
注意:Ctrl-D 似乎也是退出interact
的正确方式,但对我来说它与 Spyder 的配合不太好。【参考方案4】:
如果您希望在遇到断点时执行几个命令,则有一种特殊情况。然后是调试器命令commands
。它允许您输入多行命令,然后以 end
关键字结束整个序列。更多 (pdb) help commands
.
【讨论】:
【参考方案5】:在 Python (2.7.1) 解释器或调试器 (import pdb) 中,您可以使用以下语法执行多行语句。
for i in range(5): print("Hello"); print("World"); print(i)
注意:当我在解释器中时,我必须在代码执行之前按两次 return。然而,在调试器内部,我只需点击一次 return。
【讨论】:
它不允许运行任何比一层更深的东西。【参考方案6】:我不知道你能不能做到这一点,不过这对 ipdb 来说是一个很棒的功能。您当然可以使用列表推导,并执行简单的多行表达式,例如:
if y == 3: print y; print y; print y;
您也可以事先编写一些函数来执行您需要完成的通常需要多行的操作。
【讨论】:
以上是关于如何在 Python 自己的调试器 (PDB) 中执行多行语句的主要内容,如果未能解决你的问题,请参考以下文章