Domanda usando ipdb per eseguire il debug del codice Python in una cella (jupyter o Ipython)


Sto usando il taccuino jupyter (o Ipython) con firefox e voglio eseguire il debug di un codice python nella cella. Sto usando 'import ipdb; ipdb.set_trace () 'come tipo di breakpoint, ad esempio la mia cella ha il seguente codice:

a=4
import ipdb; ipdb.set_trace()
b=5
print a
print b

che dopo l'esecuzione con Shift + Invio mi dà questo errore:

--------------------------------------------------------------------------
MultipleInstanceError                     Traceback (most recent call last)
<ipython-input-1-f2b356251c56> in <module>()
      1 a=4
----> 2 import ipdb; ipdb.set_trace()
      3 b=5
      4 print a
      5 print b

/home/nnn/anaconda/lib/python2.7/site-packages/ipdb/__init__.py in <module>()
     14 # You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
     15 
---> 16 from ipdb.__main__ import set_trace, post_mortem, pm, run, runcall, runeval, launch_ipdb_on_exception
     17 
     18 pm                       # please pyflakes

/home/nnn/anaconda/lib/python2.7/site-packages/ipdb/__main__.py in <module>()
     71         # the instance method will create a new one without loading the config.
     72         # i.e: if we are in an embed instance we do not want to load the config.
---> 73         ipapp = TerminalIPythonApp.instance()
     74         shell = get_ipython()
     75         def_colors = shell.colors

/home/nnn/anaconda/lib/python2.7/site-packages/traitlets/config/configurable.pyc in instance(cls, *args, **kwargs)
    413             raise MultipleInstanceError(
    414                 'Multiple incompatible subclass instances of '
--> 415                 '%s are being created.' % cls.__name__
    416             )
    417 

MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.

Lo stesso errore appare se uso questo codice non nel jupyter notebook nel browser, ma in jupyter qtconsole. Che cosa significa questo errore e cosa fare per evitarlo? È possibile eseguire il debug del codice nella cella passo passo, utilizzando i comandi next, continue, etc di debugger pdb?


44
2018-02-24 21:14


origine


risposte:


Aveva anche questo problema e sembra essere correlato alle versioni di jupyter e ipdb.

La soluzione è usare questa invece della libreria ipdb set_trace chiamata:

from IPython.core.debugger import Tracer
Tracer()() #this one triggers the debugger

Fonte: http://devmartin.com/blog/2014/10/trigger-ipdb-within-ipython-notebook/

Screenshot annotato: screenshot illustrate how Tracer()() will cause Jupyter notebook to react. It pauses execution on the line in your code where you Trace()() and a new "inline" input accepts ipdb commands like 'p' or 'n' or 'c', shown here


78
2018-03-03 13:19



Se si utilizza Jupyter Notebook inizia la tua cella con il comando magico "%% di debug". Quindi una riga ipdb verrà mostrata nella parte inferiore della cella che ti aiuterà a navigare attraverso la sessione di debug. I seguenti comandi dovrebbero iniziare:

n- esegue la riga corrente e passa alla riga successiva.

c- continua l'esecuzione fino al prossimo punto di interruzione.

Assicurati di riavviare il kernel ogni volta che decidi di eseguire il debug, in modo che tutte le variabili siano assegnate di recente. Puoi controllare il valore di ogni variabile attraverso la linea ipdb e vedrai che la variabile non è definita fino a quando non esegui la linea che assegna un valore per quella variabile.

%%debug
import pdb
from pdb import set_trace as bp
def function_xyz():
    print('before breakpoint')
    bp() # This is a breakpoint.
    print('after breakpoint')

11
2018-03-29 06:57



La mia versione di Jupyter è 5.0.0 e la mia versione ipython corrispondente è 6.1.0. sto usando

import IPython.core.debugger
dbg = IPython.core.debugger.Pdb()
dbg.set_trace()

Tracer è elencato come deprecato.

Aggiornare:

Ho provato a utilizzare il metodo da un'altra risposta https://stackoverflow.com/a/43086430/8019692 sotto, ma ho ricevuto un errore:

MultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.

Preferisco il mio metodo al %% di debug magia dal momento che posso impostare i breakpoint in funzioni definite in altre celle ed eseguire la funzione in un'altra cella. Jupyter / IPython si inserisce nel debugger nella mia funzione in cui è impostato il punto di interruzione e posso usare il solito pdb comandi. A ciascuno il suo...

@ lugger1, la risposta accettata è deprecata.


8
2018-06-13 13:14



Tracer() è deprecato.

Uso:

from IPython.core.debugger import set_trace 

e poi posto set_trace() dove è necessario il punto di interruzione.

from IPython.core.debugger import set_trace

def add_to_life_universe_everything(x):
    answer = 42
    set_trace()
    answer += x

    return answer

add_to_life_universe_everything(12)

Questo funziona bene e ci porta un po 'più di comfort (ad esempio l'evidenziazione della sintassi) rispetto al semplice utilizzo del pdb integrato.

fonte


6
2017-11-23 08:56