2011-10-06 23 views
21

Spesso ho il caso che scriverò uno script, e sono all'altezza di una parte dello script in cui voglio giocare con alcune delle variabili in modo interattivo. Per arrivare a questa parte è necessario eseguire gran parte dello script che ho già scritto.python: esegui la shell interattiva python dal programma

In questo caso non è banale eseguire questo programma dall'interno della shell. Dovrei ricreare le condizioni di quella funzione in qualche modo.

Quello che voglio fare è chiamare una funzione, come runshell(), che eseguirà la shell python in quel punto del programma, mantenendo tutte le variabili in ambito, permettendomi di curiosare in esso.

Come potrei fare per farlo?

+0

Stai parlando dell'utilizzo del debugger Python? O stai cercando consigli di progettazione su come scomporre una grande sceneggiatura in pezzi più maneggevoli? –

+0

sto chiedendo il primo - avevo dimenticato quella parola ('debugger')! – Claudiu

+0

possibile duplicato di [saltare in un programma centrale Python Interactive Session?] (Http://stackoverflow.com/questions/925832/jump-into-a-python-interactive-session-mid-program) –

risposta

37
import code 

code.interact(local=locals()) 

Ma utilizzando il debugger Python è probabilmente più ciò che vuoi:

import pdb 

pdb.set_trace() 
+0

grazie! Sto cercando questo per un po '! codice di importazione – zx1986

+0

Se ci si trova in un punto di interruzione in una sessione PDB e si desidera scendere da una shell Python interattiva da lì, il 'codice di importazione; code.interact (local = locals()) 'cosa è perfetta per questo.Le variabili e le funzioni definite in quella shell interattiva sono quindi disponibili quando si preme^D e si ritorna alla sessione di debug. Grazie mille, Michael Hoffman. –

5

È possibile utilizzare il debugger Python (pdb) set_trace funzione.

Ad esempio, se si richiama uno script come questo:

def whatever(): 
    x = 3 
    import pdb 
    pdb.set_trace() 

if __name__ == '__main__': 
    whatever() 

si ottiene l'ambito nel momento in cui viene chiamato set_trace:

$ python ~/test/test.py 
--Return-- 
> /home/jterrace/test/test.py(52)whatever()->None 
-> pdb.set_trace() 
(Pdb) x 
3 
(Pdb) 
4

Per praticità vorrei aggiungere che si può mettere la traccia debugger in un uno di linea:

import pdb; pdb.set_trace() 

Che è una bella linea da aggiungere a un editor che supporti snippet, come TextMate o Vim + SnipMate. L'ho creato per espandere "break" nel rivestimento di cui sopra.

+0

sì, questo è davvero quello che finisco per fare oggigiorno – Claudiu

12

Di gran lunga il metodo più conveniente che ho trovato è:

import IPython 
IPython.embed() 

È possibile ottenere tutte le variabili globali e locali e di tutti i comfort di IPython: completamento automatico, auto rientri, ecc

Devi installare il modulo IPython per usarlo ovviamente:

pip install ipython 
+0

Amo questo con un avvertimento. Devo rifare le mie importazioni. Qualche modo per passare attraverso le importazioni alla nuova shell interattiva? – kdauria

Problemi correlati