如何从PDB导出变量?

lum*_*ric 8 python pdb

想象一下以下场景:从IPython shell启动脚本,并在断点处调用python调试器.使用PDB命令,可以在此时分析代码和变量.但事实证明,变量的值需要进行更深入的研究.

是否可以将变量的值导出到IPython shell?

我的具体用例:我遇到了一个非常庞大的numpy数组,似乎没有正确的值.我知道我可以从python调试器运行任何python命令,但将变量的值保存在不同的断点并在IPython shell中使用所有这些命令会很有帮助.我想像这样的东西

ipdb> global var1; var1 = var
ipdb> continue
...
ipdb> global var2; var2 = var
ipdb> continue
... 
In [2]: abs(var1 - var2) # do some interesting calculations with IPython
Run Code Online (Sandbox Code Playgroud)

che*_*oza 11

你可以使用globals():

ipdb>__name__
'my_module'
ipdb> get_var = 'a value'
ipdb> globals()['myvar'] = get_var
ipdb> q
In [11]: my_module.myvar
Out[11]: 'a value'
Run Code Online (Sandbox Code Playgroud)

这假定设置了断点my_module.py,因此我们正在编辑模块的全局变量my_module.

  • `import sys`,然后 `sys.modules['__main__'].myvar = get_var` (2认同)

seg*_*sai 6

不是一个漂亮的解决方案,但工作:

ipdb> import cPickle; f=open('/tmp/dump1','w+'); cPickle.dump(var,f); f.close()
Run Code Online (Sandbox Code Playgroud)

...

ipdb> import cPickle; f=open('/tmp/dump2','w+'); cPickle.dump(var,f); f.close()
Run Code Online (Sandbox Code Playgroud)

然后

In [2]: var1 = cPickle.load(open('/tmp/dump1'))
In [3]: var2 = cPickle.load(open('/tmp/dump2'))
Run Code Online (Sandbox Code Playgroud)


nym*_*ymk 6

你需要区分不同的globals()
例如,假设我们有一个模块:mymodule.py

foo = 100
def test():
    bar = 200
    return bar
Run Code Online (Sandbox Code Playgroud)

我们在 的控制下运行它pdb

>>> import pdb
>>> import mymodule
>>> foobar = 300
>>> pdb.run('mymodule.test()')
> <string>(1)<module>()
(Pdb) print foobar
300
(Pdb) print foo
*** NameError: name 'foo' is not defined
(Pdb) global foobar2; foobar2 = 301
(Pdb) print foobar2
301
Run Code Online (Sandbox Code Playgroud)

一开始,即执行之前test(),pdb中的环境是你当前的globals(). 因此foobar定义了,而foo未定义。
然后我们执行test()并在结束时停止bar = 200

-> bar = 200
(Pdb) print bar
200
(Pdb) print foo
100
(Pdb) print foobar
*** NameError: name 'foobar' is not defined
(Pdb) global foo2; foo2 = 101
(Pdb) print foo2
101
(Pdb) c
>>> 
Run Code Online (Sandbox Code Playgroud)

pdb 中的环境已更改。它使用mymodules globals()in test()is not defined. while因此定义了“foobar foo”。

我们导出了两个变量foobar2foo2。但他们生活在不同的范围。

>>> foobar2
301
>>> mymodule.foobar2

Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    mymodule.foobar2
AttributeError: 'module' object has no attribute 'foobar2'
>>> mymodule.foo2
101
>>> foo2

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    foo2
NameError: name 'foo2' is not defined
Run Code Online (Sandbox Code Playgroud)

您已经找到了解决方案。但其工作原理略有不同。