15 Stimmen

Wie exportiere ich eine Variable aus PDB?

Stellen Sie sich das folgende Szenario vor: Ein Skript wird von der IPython-Shell aus gestartet und an einem Breakpoint wird der Python-Debugger aufgerufen. Mit den PDB-Befehlen kann man den Code und die Variablen an diesem Punkt analysieren. Oft stellt sich jedoch heraus, dass die Werte der Variablen weitere Untersuchungen erfordern.

Ist es möglich, den Wert einer Variablen an die IPython-Shell zu exportieren?

Mein spezieller Anwendungsfall: Ich habe Schwierigkeiten mit einem ziemlich großen Numpy-Array, das anscheinend nicht die richtigen Werte hat. Ich weiß, dass ich beliebige Python-Befehle vom Python-Debugger aus ausführen kann, aber es wäre hilfreich, die Werte der Variablen an verschiedenen Breakpoints zu speichern und alle von ihnen in der IPython-Shell zu verwenden. Ich stelle mir etwas wie vor

ipdb> global var1; var1 = var
ipdb> continue
...
ipdb> global var2; var2 = var
ipdb> continue
... 
In [2]: abs(var1 - var2) # führen Sie interessante Berechnungen mit IPython durch

15voto

chespinoza Punkte 2608

Sie können globals() verwenden:

ipdb>__name__
'my_module'
ipdb> get_var = 'ein Wert'
ipdb> globals()['myvar'] = get_var
ipdb> q
In [11]: my_module.myvar
Out[11]: 'ein Wert'

Dies setzt voraus, dass der Breakpoint in my_module.py gesetzt ist, daher bearbeiten wir die globals des Moduls my_module.

7voto

sega_sai Punkte 7940

Keine schöne Lösung, aber funktioniert:

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

dann

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

5voto

nymk Punkte 3263

Sie müssen verschiedene globals() unterscheiden.
Zum Beispiel nehmen wir an, wir haben ein Modul: mymodule.py

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

Wir führen es unter der Kontrolle von pdb aus.

>>> import pdb
>>> import mymodule
>>> foobar = 300
>>> pdb.run('mymodule.test()')
> (1)()
(Pdb) print foobar
300
(Pdb) print foo
*** NameError: name 'foo' is not defined
(Pdb) global foobar2; foobar2 = 301
(Pdb) print foobar2
301

Zu Beginn, also bevor test() ausgeführt wird, ist die Umgebung in pdb Ihr aktuelles globals(). Daher ist foobar definiert, während foo nicht definiert ist.
Dann führen wir test() aus und bleiben am Ende von bar = 200 stehen

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

Die Umgebung in pdb wurde geändert. Es verwendet mymodule's globals() in test(). Daher ist 'foobar' nicht definiert, während 'foo' definiert ist.

Wir haben zwei Variablen foobar2 und foo2 exportiert. Aber sie existieren in unterschiedlichen Bereichen.

>>> foobar2
301
>>> mymodule.foobar2

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

Traceback (most recent call last):
  File "", line 1, in 
    foo2
NameError: name 'foo2' is not defined

Sie haben bereits die Lösung gefunden. Aber sie funktioniert geringfügig anders.

1voto

Arthur.V Punkte 646

Basierend auf den Antworten und Kommentaren oben, fühlte sich dieser Ansatz für mich am geradlinigsten an:

ipdb> import sys
ipdb> sys.abcdef = some_debugged_variable
ipdb> c

In [18]: import sys
In [19]: ipython_var = sys.abcdef

Sie können dort auch ein Dictionary speichern und mehrere benannte Objekte halten, falls dies erforderlich ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X