2011-05-11 127 views
98

所以我跑在其中我打电话Python的调试器,PDB通过编写Python脚本:如何Python的调试器中执行多行语句(PDB)

import ipdb; ipdb.set_trace() 

(IPython中的版本PDB,虽然对于这个问题,我认为这不会有什么区别;我只用它作为彩色输出)。

现在,当我去调试我要执行多行语句,如或如果子句的for循环,但只要我型

if condition: 

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

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

回答

2

我不知道你是否可以做到这一点,但这是ipdb的一个很棒的功能。您可以使用列表内涵,当然,并执行类似简单的多行表达式:

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

你也可以写一些功能预先做什么是你需要做,通常会采取多条线路。

23

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

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

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

+0

它不允许运行比一个层次更深的任何东西。 – 2018-01-07 19:19:22

6

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

175

你能做到这一点,而在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会话。

+4

辉煌,感谢提示 – cedbeu 2013-08-16 13:25:41

+10

使用pdb'interact'命令([我从这个bug跟踪器消息中学到](http://bugs.python.org/msg215963))看起来可以达到同样的效果。 – gerrit 2014-06-11 15:15:52

+1

为什么'import'语句中需要'!'? – 2014-11-14 09:06:18

10

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

Start an interactive interpreter (using the code module) whose global namespace contains all the (global and local) names found in the current scope.

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

+0

当我这样做时,它给了我“NameError:name'interact'没有定义”。 – Jason 2017-12-14 04:10:46

+0

@jason 3.2或更高版本 – vaerek 2017-12-14 04:13:57

+0

解释。我在Python 2.7。 – Jason 2017-12-14 06:49:06