2010-11-15 28 views
7

我是ipython的新手,我尝试使用ipython来调试我的代码。我所做的:使用ipython和%pdb在调试会话中访问变量

[1]: %pdb 
Automatic pdb calling has been turned ON 

然后

In [2]: %run mycode.py 

,并在代码中,我有1/0所以它抛出一个异常,并会自动进入调试会话。

ZeroDivisionError: float division 

ipdb> variable 
array([ 0.00704313, -1.34700666, -2.81474391]) 

所以我可以访问变量。但是,当我做到以下几点:

ipdb> b = variable 
*** The specified object '= variable' is not a function or was not found along sys.path. 

但这个工程:

ipdb> b = self.X 

回答

9

b用于设置断点。所以无论如何b预计是一个函数或行号。

如果您输入ipdb> help,您将看到完整的命令列表(保留字)。

你可以使用,比如说,xy作为变量:

ipdb> y = variable 

ipdb> exec 'b = variable' 
+0

有什么办法重载这个B命令?在我的应用程序中,变量名b很自然地发生,并且它是一种无法使用它的痛苦。 – joon 2010-11-15 20:11:43

+0

@joon:拥有一个字母的变量名通常不是一个好的编程习惯。也许这是问题应该激励你改变变量名称。我意识到这可能很难做到。在这种情况下,你可以尝试'exec'b = variable''。 – unutbu 2010-11-15 20:39:18

+2

当然。这只是字符b是数学对应物的自然选择。谢谢! – joon 2010-11-16 21:38:30

0

可以使用

locals()["b"] = variable 
1

我认为你需要使用“! “ (pdb documentation): !语句 在当前堆栈帧的上下文中执行(单行)语句。除非该语句的第一个单词类似于调试器命令,否则可省略感叹号。要设置一个全局变量,你可以使用前缀在同一行的全局声明分配命令,例如:

global list_options; list_options = ['-l']