Come entrare in REPL (Read, Eval, Print, Loop) dal codice Python


109

C'è un modo per forzare programmaticamente uno script Python a cadere in un REPL in un punto arbitrario della sua esecuzione, anche se lo script è stato avviato dalla riga di comando?

Sto scrivendo un programma di plottaggio veloce e sporco, che desidero leggere i dati da stdin o un file, tracciarli e quindi rilasciarli in REPL per consentire la personalizzazione del grafico.

Risposte:


105

Potresti provare a utilizzare l'opzione interattiva per python:

python -i program.py

Questo eseguirà il codice in program.py, quindi andrà a REPL. Tutto ciò che definisci o importi nel livello superiore di program.py sarà disponibile.


21
Quando sei pronto per passare al lato oscuro, ipython -i program.py è lì per te.
joeforker

Impressionante e semplice.
Nishant

127

Lo uso spesso:

def interact():
    import code
    code.InteractiveConsole(locals=globals()).interact()

47
Puoi farlo anche più semplice di così: importare codice; code.interact (local = locals ())
Steven Kryskalla

3
All'interno pdb, puoi usare interact.
gerrit

43

Ecco come dovresti farlo (IPython> v0.11):

import IPython
IPython.embed()

Per IPython <= v0.11:

from IPython.Shell import IPShellEmbed

ipshell = IPShellEmbed()

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

Dovresti usare IPython, la Cadillac di Python REPLs. Vedi http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython

Dalla documentazione:

Può anche essere utile in situazioni di elaborazione scientifica in cui è normale che sia necessario eseguire alcune parti automatiche e computazionalmente intense e quindi fermarsi a guardare dati, grafici, ecc. L'apertura di un'istanza IPython ti darà pieno accesso ai tuoi dati e funzioni, e puoi riprendere l'esecuzione del programma una volta che hai finito con la parte interattiva (magari per interromperla di nuovo più tardi, tutte le volte che è necessario).


3
IPython è fantastico, ma se l'OP vuole una soluzione che utilizzi solo Python integrato, la soluzione code.InteractiveConsole () di Jason è come "dovresti" farlo. :-)
Ben Hoyt

18

Per usare iPython e le funzionalità del debugger dovresti usare ipdb ,

Puoi usarlo allo stesso modo di pdb, con l'aggiunta di:

import ipdb
ipdb.set_trace()

17

Puoi avviare il debugger:

import pdb;pdb.set_trace() 

Non sei sicuro di cosa vuoi per il REPL, ma il debugger è molto simile.


3
Sospetto che vorrebbe apportare modifiche in tempo reale a un processo in esecuzione, alla Lisp.
Pinochle

1
C'è un modo per riprendere l'esecuzione dello script che ti ha lanciato in pdb?
Jeff Welling

1
Tendo a scrivere frammenti di codice in VIM instaed di Python, salvarlo e quindi fare un! Python -i% per esempio. O pdb. Questo è un buon caso d'uso.
Nishant

0

L'ho appena fatto in uno dei miei script (funziona all'interno di un framework di automazione che è un enorme PITA da strumentare):

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

Posizionalo dove vuoi un punto di interruzione e puoi controllare lo stato usando la stessa sintassi dell'interprete python (sebbene non sembri permetterti di importare i moduli). Non è molto elegante, ma non richiede nessun'altra configurazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.