2009-07-11 4 views
2

Ich verwende pdb, um ein Skript mit run -d in einer Ipython-Sitzung zu untersuchen. Es wäre nützlich, einige der Variablen zu plotten, aber ich brauche sie in der Haupt-Ipython-Umgebung, um dies zu tun.Ist es möglich, eine Variable aus einer PDB-Sitzung in die ursprüngliche interaktive Sitzung zu übergeben?

Also was ich suche ist eine Möglichkeit, eine Variable in der interaktiven Sitzung nach dem Beenden von pdb wieder verfügbar zu machen. Wenn Sie eine Variable im obersten Frame festlegen, scheint sie in der ipython-Sitzung vorhanden zu sein, aber dies funktioniert nicht für weiter unten liegende Frames.

So etwas wie export im Folgenden:

ipdb> myvar = [1,2,3] 
ipdb> p myvar 
[1, 2, 3] 
ipdb> export myvar 
ipdb> q 

In [66]: myvar 
Out[66]: [1, 2, 3] 

Antwort

2

Per ipython des docs, und auch einen run? Befehl von der ipython Aufforderung

nach der Ausführung, der IPython interaktive Namensraum wird aktualisiert mit alle im Programm definierten Variablen (außer __name__ und sys.argv)

Durch "im Programm definiert" (ein leicht schlampiger Gebrauch von Begriffen), bedeutet es nicht "irgendwo innerhalb verschachtelter Funktionen dort gefunden" - es bedeutet "in der globals() des Skripts/Moduls Sie" wieder run ning. Wenn Sie in irgendeiner Art von Verschachtelung sind, sollte globals()['myvar'] = [1,2,3] immer noch gut funktionieren, genau wie Ihre erhoffte export würde, wenn es existierte.

bearbeiten: Wenn Sie in einem anderen Modul sind, dann müssen Sie den Namen in dem Globals Ihres Original setzen - nach einem import sys, wenn nötig, sys.modules["originalmodule"].myvar = [1, 2, 3] wird tun, was Sie sich wünschen.

+0

Ich hatte versucht, die Variable zu einem globalen machen, aber das scheint nicht zu funktionieren, wenn ein anderes Modul in einem der Frames aufgerufen wurde. Wenn Sie zum Beispiel test.py ausführen, das eine Funktion in test2.py aufruft und dann ein globales Element in diesem Frame deklariert, kann ich es weder in den höheren Frames (die in einem anderen Modul ausgeführt werden) noch im ipython-Namespace sehen. – ihuston

+0

Wenn Sie sich in einem anderen Modul befinden, müssen Sie den Namen in den Globals Ihres Originals eingeben und meine Antwort entsprechend bearbeiten. –

+0

Stellt sich heraus, dass eine globale Variable in einem Rahmen innerhalb eines Moduls, das aus dem ursprünglichen Skript aufgerufen wird, es nur in dem __dict__ dieses Moduls setzt. Also vom obersten Frame ist "test2" in globals() und "myvar" ist in globals() ["test2"] .__ dict__. Ich denke, ich vermutete, dass die globale Variable würde es direkt in globals() für den oberen Frame (und Ipython) setzen, aber das scheint nicht zu funktionieren. – ihuston