想象以下场景:脚本从 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
你可以使用 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'
假设断点设置在
my_module.py
,所以我们正在编辑模块的全局变量my_module
.
不是一个漂亮的解决方案,但有效:
ipdb> import cPickle; f=open('/tmp/dump1','w+'); cPickle.dump(var,f); f.close()
...
ipdb> import cPickle; f=open('/tmp/dump2','w+'); cPickle.dump(var,f); f.close()
然后
In [2]: var1 = cPickle.load(open('/tmp/dump1'))
In [3]: var2 = cPickle.load(open('/tmp/dump2'))
需要区分不同的
globals()
.foo = 100
def test():
bar = 200
return bar
我们在
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
一开始,也就是在执行
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
>>>
更改了pdb中的环境。它在
mymodule
中使用globals()
的test()
。因此定义了'foobaris not defined. while
foo`。我们导出了两个变量
foobar2
和foo2
。但他们生活在不同的范围。
>>> 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
您已经找到了解决方案。但它的工作方式略有不同。
根据上面的回答和评论,这对我来说是最直接的方法:
ipdb> import sys
ipdb> sys.abcdef = some_debugged_variable
ipdb> c
In [18]: import sys
In [19]: ipython_var = sys.abcdef
如果需要,您还可以在那里存储字典并保存多个命名对象。