2009-09-08 10 views
85

C'è un modo per forzare a livello di programmazione uno script Python in un REPL in un punto arbitrario nell'esecuzione, anche se lo script è stato avviato da la riga di comando?Come rilasciare REPL (Read, Eval, Print, Loop) dal codice Python

Sto scrivendo un programma di plottaggio rapido e sporco, che desidero leggere i dati da stdin o da un file, tracciarlo e quindi inserirlo nel REPL per consentire la personalizzazione del grafico.

risposta

78

Si potrebbe provare a utilizzare l'opzione interattiva per Python:

python -i program.py 

Questo eseguirà il codice program.py, poi vai al REPL. Tutto ciò che definisci o importi nel livello più alto di program.py sarà disponibile.

+13

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

+0

Impressionante e semplice. – Nishant

+0

Mi hai appena fatto impazzire. – Bemmu

16

È possibile avviare il debugger:

import pdb;pdb.set_trace() 

Non sei sicuro di ciò che si desidera che il REPL per, ma il debugger è molto simile.

+3

Sospetto che gli piacerebbe apportare modifiche in tempo reale a un processo in esecuzione, à la Lisp. – Pinochle

+1

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

+0

Tendo a scrivere snippet 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

38

Ecco come si dovrebbe fare (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 

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

Dalla documentazione:

Può anche essere utile nel situazioni di calcolo scientifico in cui è comune bisogno di fare un po ', parte di calcolo intensive automatico e poi fermarsi a guardare i dati L'apertura di un'istanza IPython darà a l'accesso completo ai dati e alle funzioni ed è possibile riprendere l'esecuzione del programma una volta terminata la parte interattiva (perha ps per interrompere più tardi, tutte le volte che è necessario).

+3

IPython è ottimo, ma se l'OP vuole una soluzione che utilizza solo Python integrato, la soluzione di codice.InteractiveConsole() di Jason è come "dovresti" farlo. :-) –

102

Mi capita spesso di uso questo:

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

I documenti per il modulo "codice" sono qui: http://docs.python.org/library/code.html –

+36

Puoi farlo anche più semplice di così: codice di importazione; code.interact (local = locals()) –

+1

All'interno di 'pdb', puoi usare' interact'. – gerrit

14

per ottenere l'uso di ipython e la funzionalità del debugger si dovrebbe usare ipdb,

si può utilizzare allo stesso modo come pdb, con l'aggiunta di:

import ipdb 
ipdb.set_trace() 
0

ho appena fatto questo in uno dei miei script (che gira all'interno di un framework di automazione che è un enorme PITA a strumento):

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 

Basta posizionarlo ovunque si desideri un punto di interruzione ed è possibile controllare lo stato utilizzando la stessa sintassi dell'interprete python (sebbene non sembri consentire l'importazione dei moduli). Non è molto elegante, ma non richiede altre impostazioni.