So lassen Sie sich aus Python-Code in REPL (Lesen, Auswerten, Drucken, Schleifen) einfügen

108

Gibt es eine Möglichkeit, ein Python-Skript programmgesteuert zu zwingen, an einem beliebigen Punkt seiner Ausführung in eine REPL zu fallen, selbst wenn das Skript über die Befehlszeile gestartet wurde?

Ich schreibe ein schnelles und schmutziges Plotprogramm, mit dem ich Daten aus stdin oder einer Datei lesen, plotten und dann in REPL ablegen möchte, damit das Plot angepasst werden kann.

Dsimcha
quelle

Antworten:

104

Sie können versuchen, die interaktive Option für Python zu verwenden:

python -i program.py

Dadurch wird der Code in program.py ausgeführt und anschließend REPL aufgerufen. Alles, was Sie in der obersten Ebene von program.py definieren oder importieren, ist verfügbar.

Alex
quelle
21
Wenn Sie bereit sind, auf die dunkle Seite zu wechseln, ist ipython -i program.py für Sie da.
Joeforker
Beeindruckend und einfach.
Nishant
126

Ich benutze dies häufig:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()
Jason R. Coombs
quelle
47
Sie können es noch einfacher machen: Code importieren; code.interact (lokal = Einheimische ())
Steven Kryskalla
3
Innerhalb pdbkönnen Sie verwenden interact.
Gerrit
43

So sollten Sie es machen (IPython> v0.11):

import IPython
IPython.embed()

Für IPython <= v0.11:

from IPython.Shell import IPShellEmbed

ipshell = IPShellEmbed()

ipshell() # this call anywhere in your program will start IPython

Sie sollten IPython verwenden, den Cadillac von Python REPLs. Siehe http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

Aus der Dokumentation:

Dies kann auch in wissenschaftlichen Computersituationen nützlich sein, in denen häufig ein automatischer, rechenintensiver Teil ausgeführt und dann keine Daten, Diagramme usw. mehr angezeigt werden müssen. Durch Öffnen einer IPython-Instanz erhalten Sie vollen Zugriff auf Ihre Daten und Funktionen. und Sie können die Programmausführung fortsetzen, sobald Sie mit dem interaktiven Teil fertig sind (möglicherweise, um später so oft wie nötig erneut anzuhalten).

Joeforker
quelle
3
IPython ist großartig, aber wenn das OP eine Lösung wünscht, die nur integriertes Python verwendet, ist Jasons Code.InteractiveConsole () -Lösung genau das, was Sie tun sollten. :-)
Ben Hoyt
18

Um iPython und die Funktionalität des Debuggers nutzen zu können , sollten Sie ipdb verwenden .

Sie können es auf die gleiche Weise wie pdb verwenden, mit dem Zusatz von:

import ipdb
ipdb.set_trace()
bluszcz
quelle
17

Sie können den Debugger starten:

import pdb;pdb.set_trace() 

Nicht sicher, wofür Sie die REPL wollen, aber der Debugger ist sehr ähnlich.

Ned Batchelder
quelle
3
Ich würde vermuten, dass er Live-Änderungen an einem laufenden Prozess à la Lisp vornehmen möchte.
Pinochle
1
Gibt es eine Möglichkeit, die Ausführung des Skripts fortzusetzen, mit dem Sie pdb gestartet haben?
Jeff Welling
1
Ich neige dazu, Codefragmente in VIM zu schreiben, die von Python installiert wurden, es zu speichern und dann zum Beispiel ein! Python -i% zu machen. Oder pdb. Das ist ein guter Anwendungsfall.
Nishant
0

Ich habe dies gerade in einem meiner eigenen Skripte getan (es läuft in einem Automatisierungsframework, das eine riesige PITA für das Instrument darstellt):

x = 0 # exit loop counter
while x == 0:
    user_input = raw_input("Please enter a command, or press q to quit: ")
    if user_input[0] == "q":
        x = 1
    else:
        try:
            print eval(user_input)
        except:
            print "I can't do that, Dave."
            continue

Platzieren Sie dies einfach an einer beliebigen Stelle, an der Sie einen Haltepunkt wünschen, und Sie können den Status mit derselben Syntax wie der Python-Interpreter überprüfen (obwohl Sie anscheinend keine Modulimporte durchführen können). Es ist nicht sehr elegant, erfordert aber kein anderes Setup.

Rasiermesser
quelle