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


157

因此,我正在运行一个Python脚本,在其中编写以下代码来调用Python的调试器PDB:

import ipdb; ipdb.set_trace()

(iPython的PDB版本,尽管如此,我认为这没有什么区别;我仅将其用于彩色输出)。

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

if condition:

然后按回车键,我得到错误信息 *** SyntaxError: invalid syntax (<stdin>, line 1)

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

Answers:


265

您可以在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会话。


46
使用pdb interact命令似乎可以实现相同的效果(正如我从此错误跟踪程序消息中了解到的那样)。
格里特2014年

3
为什么!import声明中需要?
Indradhanush Gupta 2014年

19
可能不需要这样做,但是我习惯在pdb中为所有Python语句加上前缀!,以免发生意外。例如c = 42,pdb中的代码将继续执行,而不是分配给variable c
Marius Gedminas 2014年

8
@MariusGedminas对于PDB来说最令人沮丧的是!如果他们的命令必须加上前缀会很好...
Ian Clark

注意:Ctrl-D似乎也是退出的正确方法interact,但对Spyder而言,它对我来说效果不佳。
Josiah Yoder

69

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

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

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


2
这样做时,它给我“ NameError:未定义名称'interact'”。
杰森

1
@jason 3.2或更高版本
vaer-k

2
这就解释了。我在python 2.7中。
杰森

小心这实际上引发了一个错误,即可能无法定义交互并退出了该过程
Camron_Godbout

1
我认为建议避免interact的建议过于强烈。90%这就是我所需要的,而且打字起来比from IPython import embed; embed()
vaer-k

43

我的建议是使用IPython嵌入。

ipdb> from IPython import embed; embed()

2
如果您在列表理解中没有定义值,请尝试从IPython使用import embed; embed(user_ns=locals())
fx-kirin

1
这对我来说比接受的答案好得多。例如,它允许对多行进行适当的编辑,例如备份几行并修复某些问题,因此您不必再次重写整个多行表达式……我将本地人传递为@ fx-kirin建议。
ZeDuS

33

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

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

注意:当我进入解释器时,必须在代码执行前按两次回车键。但是,在调试器内部,我只需点击一次return即可。


5
它不允许运行任何深于一层的内容。
安东尼·哈奇金斯

7

如果您想在达到断点时执行几个命令,则是一种特殊情况。然后是debugger命令commands。它允许您输入多行命令,然后以end关键字结束整个序列。更多(pdb) help commands


2

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

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

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


-6

在文本编辑器中编写代码,然后将其粘贴到调试器中:

if True:
    print('a')

这是一个愚蠢的解决方案,但又脏又快又可以工作。它可以在Linux终端上运行,但是我不确定它是否可以在Windows控制台上运行。


3
老实说,我不会说调用外部程序,编写,复制和粘贴很快速,只是很脏:P
数据科学家

4
这对我不起作用,所以对您不起作用*** SyntaxError: unexpected EOF while parsing
Yash Kant
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.