How to export a variable from PDB?

Imagine the following script: a script is launched from the IPython shell and the python debugger is called at the breakpoint. Using the PDB commands, you can analyze the code and variables at this point. But it often turns out that the values ​​of the variables require more in-depth research.

Is it possible to export the value of a variable to the IPython shell?

My specific use case: I am struggling with a rather huge massive array that does not seem to have the correct values. I know that I can run any python commands from the python debugger, but it would be useful to store the variable values ​​at different points of the break and use them all in the IPython shell. I'm portraying something like

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 
+7
source share
3 answers

You can use 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' 

This assumes that the point my_module.py set to my_module.py , so we are editing the global variables of the my_module module.

+10
source

Not a good solution, but it works:

 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() 

then

 In [2]: var1 = cPickle.load(open('/tmp/dump1')) In [3]: var2 = cPickle.load(open('/tmp/dump2')) 
+6
source

You need to distinguish between different globals() .
For example, suppose we have a module: mymodule.py

 foo = 100 def test(): bar = 200 return bar 

We run it under the control of 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 

At the beginning, namely, before running test() , the environment in pdb is your current globals() . Thus, foobar is defined, and foo not defined.
Then we execute test() and stop at the end of 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 >>> 

The environment in pdb has been changed. It uses mymodule globals() in test() . Thus, foobar is not defined. while is not defined. while foo`.

We exported two variables foobar2 and foo2 . But they live in different areas.

 >>> 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 

You have already found a solution. But it works a little differently.

+2
source

All Articles