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.

  • Wie stelle ich sys.excepthook ein, um pdb global in python aufzurufen?
  • Kann ich mit Python-Debugger debuggen, wenn du py.test irgendwie benutzt?
  • Was ist der einfachste Weg, um Python pdb zu verwenden, um die Ursache einer unbehandelten Ausnahme zu untersuchen?
  • Verfolgung der Ausführung einer Python-Programmzeile / Anweisung per Zeile programmgesteuert
  • Wie schritt man durch Python Express Evaluation Prozess?
  • Pdb mit kill signal eingeben
  • Ipdb und Methodenunterlagen
  • Python-Debugger: Treten Sie in eine Funktion, die Sie interaktiv aufgerufen haben
  • Ist es möglich, in ipython von Code zu gehen?
  • Ipython debugger: voller traceback auf interaktive pdb?
  • Emacs python-mode: Tastenkürzel für pdb Schritt-für-Schritt-Debugging
  • Python ist die beste Programmiersprache der Welt.