如何在Python自己的调试器(PDB)中执行多行语句

Mik*_*ike 135 python debugging multiline pdb

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

import ipdb; ipdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

(iPython的PDB版本,虽然我认为它不会产生影响;我只将其用于彩色输出).

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

if condition:
Run Code Online (Sandbox Code Playgroud)

并点击返回键,我收到错误信息 *** SyntaxError: invalid syntax (<stdin>, line 1)

如何在PDB中执行多行语句?如果不可能有一种解决方法仍然执行if子句或for循环?

Mar*_*nas 241

您可以在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)
>>> 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 看起来使用pdb`interactive`命令([我从这个bug跟踪器消息中学到](http://bugs.python.org/msg215963))也可以实现. (34认同)
  • 它可能不需要,但我习惯在pdb中为所有Python语句添加前缀`!`,以避免发生意外.例如,pdb中的`c = 42`将*继续*执行而不是分配给变量`c`. (15认同)
  • @MariusGedminas是PDB最令人沮丧的事情!如果*他们的*命令必须加上前缀会很好... (7认同)
  • 为什么在import语句中需要`!`? (2认同)

vae*_*r-k 49

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

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

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

  • 这就解释了。我在 python 2.7 中。 (3认同)
  • 我认为建议避免“互动”的建议太强烈了。90% 这就是我所需要的,而且它比“from IPython import embed;”更容易输入。嵌入()` (3认同)
  • 这样做时,它给了我“NameError: name 'interact' is not defined”。 (2认同)
  • @jason 3.2 或更高版本 (2认同)

Gar*_*yde 33

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

for i in range(5): print("Hello"); print("World"); print(i)
Run Code Online (Sandbox Code Playgroud)

注意:当我在解释器中时,我必须在代码执行之前按两次返回.但是,在调试器内部,我只需要返回一次.

  • 它不允许运行任何比一个级别更深的东西. (5认同)

fx-*_*rin 31

我的建议是使用IPython嵌入.

ipdb> from IPython import embed; embed()
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这实际上是目前最好的答案. (5认同)
  • 如果您在列表理解中遇到 value is not defined 错误,请尝试使用 from IPython `import embed; 嵌入(user_ns=locals())`。 (4认同)
  • 这对我来说比公认的答案要好得多。例如 - 它允许正确编辑多行 - 例如返回几行并修复某些内容,因此您不必再次重写整个多行表达式...我将当地人作为 @fx-kirin 传递建议。 (3认同)
  • 我设置了一个别名,这样我只需输入“e”即可在 pdb 中激活它:在 `.pbdrc` 中,输入 `alias e !from IPython import embed; 嵌入(user_ns = locals())`。如果您使用 pdbpp (pdb++),请勿将其放入 `.pbdrc.py` 中,它将不起作用 - 创建一个 `.pbdrc` 文件。与“interact()”相比,我更喜欢它,因为即使我复制和粘贴代码最终得到“错误”的缩进集,它也能工作。 (2认同)

Tho*_*asH 7

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


zee*_*kay 2

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

if y == 3: print y; print y; print y;
Run Code Online (Sandbox Code Playgroud)

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