Wie exportiere ich eine Variable vom PDB?

Stellen Sie sich das folgende Szenario vor: ein Skript wird von der IPython-Shell gestartet und an einem Pausenpunkt wird der Python-Debugger aufgerufen. Mit den PDB-Befehlen kann man den Code und die Variablen an dieser Stelle analysieren. Aber oft stellt sich heraus, dass die Werte der Variablen eine tiefere Forschung fordern.

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

Mein spezieller Anwendungsfall: Ich kämpfe mit einem ziemlich riesigen, numpy Array, das nicht die richtigen Werte hat. Ich weiß, dass ich irgendwelche Python-Befehle aus dem Python-Debugger ausführen kann, aber es wäre hilfreich, die Werte der Variablen an verschiedenen Pausenpunkten zu speichern und sie alle bei der IPython-Shell zu verwenden. Ich stelle mir so etwas vor

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 

3 Solutions collect form web for “Wie exportiere ich eine Variable vom PDB?”

Sie können globals () verwenden:

 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' 

Dies setzt my_module.py , dass der Bruchpunkt in my_module.py , also bearbeiten wir die globals des Moduls my_moule .

Keine hübsche Lösung, aber das Arbeiten:

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

Sie müssen verschiedene globals() unterscheiden globals() .
Angenommen, wir haben ein Modul: mymodule.py

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

Wir führen es unter der Kontrolle von 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 

Am Anfang, nämlich vor dem Ausführen von test() , ist die Umgebung in pdb Ihre aktuellen globals() . So ist foobar definiert, während foo nicht definiert ist.
Dann führen wir test() und stoppen am Ende von 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 >>> 

Die Umgebung in pdb wurde geändert. Es verwendet mymodule 's globals() in test() . So ist 'foobar is not defined. while is not defined. while foo` definiert ist.

Wir haben zwei Variablen foobar2 und foo2 exportiert. Aber sie leben in verschiedenen Bereichen.

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

Sie haben die Lösung bereits gefunden. Aber es funktioniert etwas anders.

  • Was ist der richtige Weg, um im iPython Notebook zu debuggen?
  • Wie sehen Sie eine Variable in pdb
  • Python-Debugger: Treten Sie in eine Funktion, die Sie interaktiv aufgerufen haben
  • Die Python-Variable wird in pdb- und print-Anweisungen unterschiedlich ausgewertet
  • Führen Sie pdb ohne stdin / stdout mit FIFO aus
  • Ipython debugger: voller traceback auf interaktive pdb?
  • Wie schritt man durch Python Express Evaluation Prozess?
  • Wie man alle Variablenwerte beim Debuggen von Python mit pdb ausdruckt, ohne jede Variable anzugeben?
  • Interrupt (Pause) läuft Python-Programm in pdb?
  • Python Debugger (pdb) gestoppt Handing up / down Pfeile, zeigt ^ [[A statt
  • Holen Sie sich die letzte Ausnahme in pdb
  • Python ist die beste Programmiersprache der Welt.