cadere nell'interprete python durante l'esecuzione della funzione


90

ho un modulo python con una funzione:

def do_stuff(param1 = 'a'):
    if type(param1) == int:
        # enter python interpreter here
        do_something()
    else:
        do_something_else()

c'è un modo per entrare nell'interprete della riga di comando dove ho il commento? in modo che se eseguo quanto segue in Python:

>>> import my_module
>>> do_stuff(1)

ottengo il mio prossimo prompt nell'ambito e nel contesto in cui ho il commento do_stuff()?


Risposte:


60

Inserimento

import pdb; pdb.set_trace()

a quel punto entrerà nel debugger di Python

Vedi qui: http://docs.python.org/library/pdb.html


pdbè un ottimo pitone vanigliato; se hai spazio per portare un pacchetto esterno, ipdbè fantastico - stesse funzionalità del debugger, ma con l'evidenziazione della sintassi, il completamento con tabulazioni, ecc. di ipython
khstacking

Aggiornamento - è ipdbstato deprecato, al giorno d'oggi uso pdbpp( pdb++) , che ha caratteristiche simili e funziona con import pdb; pdb.set_trace()(cioè
corregge l'

@hangtwenty: perché dici che è ipdbstato deprecato? Non riesco a trovare nessuna notizia al riguardo.
Nick Matteo

@ Kundor eh, hai ragione. Ricordo distintamente di aver letto da qualche parte che gli autori avevano deciso di interrompere la manutenzione del progetto e hanno invece indicato un altro progetto da utilizzare. Forse è successo per un po 'e poi è stato resuscitato? Potrei sbagliarmi! In entrambi i casi, mi sono divertito ipdbprima, ma mi sono divertito da pdbppallora
driftcatcher

141

Se vuoi un prompt interattivo standard (invece del debugger, come mostrato da prestomation), puoi farlo:

import code
code.interact(local=locals())

Vedi: il modulo del codice .

Se hai installato IPython e desideri invece una shell IPython, puoi farlo per IPython> = 0.11:

import IPython; IPython.embed()

o per le versioni precedenti:

from IPython.Shell import IPShellEmbed
ipshell = IPShellEmbed()
ipshell(local_ns=locals())

27
per IPython> = 0.11, non c'è più shell del modulo in IPython ... quindi avvialo usando "import IPython; IPython.embed ()" invece.
evandrix

È possibile continuare dopo essere entrati code.interact(), a la PDB c(ontinue)?
Nick T

4
code.interact()è una chiamata di blocco. Il programma si fermerà e attenderà che finisca. Se esci dall'interprete interattivo, il tuo programma dovrebbe riprendere con l'istruzione immediatamente successiva.
Matt Anderson

1
Qual è la differenza tra un prompt interattivo e un debugger?
StockB

1
@StockB È il prompt interattivo standard che lo rende importante. Il debugger è un prompt interattivo, ma non è lo stesso. In PDB, non è possibile eseguire istruzioni su più righe, la helpfunzione incorporata viene sovrascritta, ecc.
kbrose

28

Se vuoi un interprete Python predefinito, puoi farlo

import code
code.interact(local=dict(globals(), **locals()))

Ciò consentirà l'accesso sia ai locali che ai globali.

Se vuoi entrare in un interprete IPython, la IPShellEmbedsoluzione è obsoleta . Attualmente ciò che funziona è:

from IPython import embed
embed()

8
grazie, code.interact(local=dict(globals(), **locals()))è molto meglio che code.interact(local=locals())perché quest'ultimo ti fa reimportare i pacchetti
s2t2

Questa risposta ha funzionato meglio per me poiché stavo usando uno script bash per chiamare il mio codice Python. Non ho potuto interagire con il mio codice Python usando la risposta accettata. Grazie!
jonathanking
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.