Qual è il modo giusto per eseguire il debug in iPython notebook?


121

Come so, %debug magicposso eseguire il debug all'interno di una cella.

Tuttavia, ho chiamate di funzione su più celle.

Per esempio,

In[1]: def fun1(a)
           def fun2(b)
               # I want to set a breakpoint for the following line #
               return do_some_thing_about(b)

       return fun2(a)

In[2]: import multiprocessing as mp
       pool=mp.Pool(processes=2)
       results=pool.map(fun1, 1.0)
       pool.close()
       pool.join

Quello che ho provato:

  1. Ho provato a impostare %debugnella prima riga della cella-1. Ma entra immediatamente in modalità debug, anche prima di eseguire cell-2.

  2. Ho provato ad aggiungere %debugla riga subito prima del codice return do_some_thing_about(b). Ma poi il codice viene eseguito per sempre, non si ferma mai.

Qual è il modo giusto per impostare un punto di interruzione all'interno del notebook ipython?

Risposte:


72

Usa ipdb

Installalo tramite

pip install ipdb

Uso:

In[1]: def fun1(a):
   def fun2(a):
       import ipdb; ipdb.set_trace() # debugging starts here
       return do_some_thing_about(b)
   return fun2(a)
In[2]: fun1(1)

Per eseguire l'uso riga per riga ne per entrare in una funzione utilizzare se uscire dall'uso del prompt di debug c.

Per l'elenco completo dei comandi disponibili: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf


ipdb non mi fornisce il prompt di debug nell'altra cella con il codice di esempio menzionato nella domanda. Ora il codice continua a funzionare per sempre.
Rex

@ Rex Per me funziona. Dove hai messo ipdb? Metti import ipdb; ipdb.set_trace (); prima della riga return do_some_thing_about (b). Quindi, chiama fun1 (a) dalla seconda cella, dovrebbe funzionare. Per uscire dal promt di debug usa 'c'
Tevin Joseph KO

@ Rex ha aggiornato la risposta per maggiore chiarezza.
Tevin Joseph KO

29
Funziona nella console iPython ma non nel notebook iPython (che è la domanda posta). Quando digito import ipdb; ipdb.set_trace()all'interno di una cella del notebook, viene visualizzato il messaggioMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Bill

1
nuovo a jupyter ... sembra che sia più adatto per la presentazione e la condivisione di frammenti di codice ... possiamo avere funzionalità che gli IDE (come eclipse, rstudio) forniscono come debug effettivo, passaggio, punti di interruzione, aggiunta di watch all'espressione e variabili ecc. In un primo momento, sembra che non sia il caso, voglio solo essere sicuro .....
Mahesha999

90

Puoi usare ipdball'interno di jupyter con:

from IPython.core.debugger import Tracer; Tracer()()

Modifica : le funzioni di cui sopra sono deprecate da IPython 5.1. Questo è il nuovo approccio:

from IPython.core.debugger import set_trace

Aggiungi set_trace()dove hai bisogno di un punto di interruzione. Digita helpper i ipdbcomandi quando viene visualizzato il campo di input.


20
Tracerè stato ammortizzato. Ora funziona in questo modo: from IPython.core.debugger import set_traceed set_trace()evoca un punto di interruzione. Fonte: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko

1
Comodo da usare come una riga, dove necessario:from IPython.core.debugger import set_trace;set_trace()
Nir

15

La tua funzione di ritorno è in linea con la funzione def (funzione principale), devi dare una tabulazione ad essa. E usa

%%debug 

invece di

%debug 

per eseguire il debug dell'intera cella non solo della riga. Spero, forse questo ti aiuterà.


12

Puoi sempre aggiungerlo in qualsiasi cella:

import pdb; pdb.set_trace()

e il debugger si fermerà su quella riga. Per esempio:

In[1]: def fun1(a):
           def fun2(a):
               import pdb; pdb.set_trace() # debugging starts here
           return fun2(a)

In[2]: fun1(1)

Dovrebbe essere ipdb?
Rex

1
@ Rex Non necessariamente. ipdbè un refactor del debugger Python che è più strettamente integrato con IPython. pdbè integrato.
Two-Bit Alchemist

ipdbpuò essere utilizzato anche al di fuori della shell ipython e viene fornito con alcune comodità come il completamento con tabulazione.
gennaio

12

In Python 3.7 puoi usare la funzione breakpoint () . Basta entrare

breakpoint()

ovunque desideri che il runtime si fermi e da lì puoi usare gli stessi comandi pdb (r, c, n, ...) o valutare le tue variabili.


2
Per aggiungere a questo, quando chiami breakpoint (), puoi digitare "help" nella casella di testo che appare per ottenere un elenco di comandi.
gbeaven

Sembra esserci un problema persistente di blocco dopo l'utilizzo di breakpoint () o pdb: github.com/ipython/ipython/issues/10516
Dave Liu

8

Basta digitare import pdbjupyter notebook e quindi utilizzare questo cheatsheet per eseguire il debug. È molto conveniente.

c-> continua, s-> passo, b 12-> imposta il punto di interruzione alla riga 12 e così via.

Alcuni link utili: Python Official Document su pdb , esempi di debugger pdb di Python per una migliore comprensione di come utilizzare i comandi del debugger .

Alcuni screenshot utili: inserisci qui la descrizione dell'immagineinserisci qui la descrizione dell'immagine


Buona risposta. Tuttavia, penso (sono nuovo nel notebook Jupyter) si dovrebbe aggiungere% debug per impostare un punto di interruzione.
Ad Infinitum

Quello che faccio è copiare e incollare pdb.set_trace()dove voglio impostare un punto di interruzione, dal momento che b line_nonon funziona in Jupyter Notebook e funziona bene su python IDLE.
flowera

Grazie! Ho anche caricato alcuni screenshot che ho testato oggi. Se potessi passare a Python IDLE mi piacerebbe farlo ..
flowera

Inoltre, trovo un modo per mostrare il numero di riga sul notebook jupyter, fare clic su nuova riga e quindi premere l. Ovviamente puoi anche programmare il tuo collegamento, i collegamenti sono disponibili sul sito Web del notebook jupyter.
flowera

1
Uso sempre "p" per mostrare l'elenco dei comandi nel notebook Jupyter. Quando scrivo "mostra numeri di riga", il comando appare lì con il collegamento accanto ad esso. Puoi anche imparare la scorciatoia del comando che vuoi usare.
Ad Infinitum

8

Dopo aver ricevuto un errore, nella cella successiva corri %debuge basta.


1
questo è impressionante!
Qualcuno l'

tuttavia, questo deve attendere che si verifichi l'eccezione, potremmo voler testare qual è la variabile nel runtime impostando un punto di interruzione
Luk Aron

7

Anche il %pdbcomando magico è buono da usare. Dì solo %pdb one successivamente il pdbdebugger verrà eseguito su tutte le eccezioni, indipendentemente dalla profondità dello stack di chiamate. Molto maneggevole.

Se hai una riga in particolare di cui vuoi eseguire il debug, solleva un'eccezione lì (spesso lo sei già!) O usa il %debugcomando magico che altre persone hanno suggerito.


5

Ho appena scoperto PixieDebugger . Anche se non ho ancora avuto il tempo di testarlo, sembra davvero il modo più simile per eseguire il debug del modo in cui siamo usati in ipython con ipdb

inserisci qui la descrizione dell'immagine

Ha anche una scheda "valuta"


0

Un debugger nativo è stato reso disponibile come estensione di JupyterLab. Rilasciato poche settimane fa, questo può essere installato ottenendo l'estensione pertinente, così come il kernel xeus-python (che in particolare viene fornito senza le magie ben note agli utenti di ipykernel):

jupyter labextension install @jupyterlab/debugger
conda install xeus-python -c conda-forge

Ciò consente un'esperienza di debug visiva ben nota da altri IDE.

inserisci qui la descrizione dell'immagine

Fonte: un debugger visivo per Jupyter


xeus-python non funziona su Windows 10. Controlla il mio problema Problema xeus-python su github
sergzemsk
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.