web-dev-qa-db-fra.com

utiliser ipdb pour déboguer python dans une cellule (jupyter ou Ipython)

J'utilise jupyter (ou Ipython) notebook avec firefox, et je souhaite déboguer du code python dans la cellule. J'utilise 'import ipdb; ipdb.set_trace ()' comme sorte de point d'arrêt Par exemple, ma cellule a le code suivant:

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

qui après exécution avec Shift + Enter me donne cette erreur:

--------------------------------------------------------------------------
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.

La même erreur s’affiche si j’utilise ce code non pas dans le cahier jupyter du navigateur, mais dans jupyter qtconsole. Que signifie cette erreur et que faire pour l'éviter? Est-il possible de déboguer le code dans la cellule pas à pas, en utilisant les commandes next, continue, etc. du débogueur pdb?

51
lugger1

Avait ce problème aussi et il semble être lié aux versions de jupyter et ipdb.

La solution consiste à utiliser cela à la place de la bibliothèque ipdb set_trace appel:

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

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

Capture d'écran annotée: 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

87
Robert Muil

Si vous utilisez Jupyter Notebook, commencez votre cellule par la commande magique "%% debug". Ensuite, une ligne ipdb s'affichera au bas de la cellule pour vous aider à naviguer dans la session de débogage. Les commandes suivantes devraient vous aider à démarrer:

n - Exécute la ligne en cours et passe à la ligne suivante.

c - continue l'exécution jusqu'au prochain point d'arrêt.

Assurez-vous de redémarrer le noyau chaque fois que vous décidez de déboguer, afin que toutes les variables soient fraîchement affectées. Vous pouvez vérifier la valeur de chaque variable via la ligne ipdb et vous verrez que la variable est indéfinie jusqu'à ce que vous exécutiez la ligne valeur à cette variable.

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

Tracer() est obsolète.

Utilisation:

from IPython.core.debugger import set_trace

puis placez set_trace() où le point d'arrêt est nécessaire.

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)

Cela fonctionne bien et nous apporte un peu plus de confort (par exemple, la coloration syntaxique) que d’utiliser simplement le pdb intégré.

source

9
Mattijn

Ma version de Jupyter est 5.0.0 et ma version correspondante d’ipython est 6.1.0. j'utilise

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

Tracer est répertorié comme obsolète.

Mise à jour:

J'ai essayé d'utiliser la méthode d'une autre réponse https://stackoverflow.com/a/43086430/8019692 ci-dessous, mais une erreur s'est produite:

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

Je préfère ma méthode à la magie %% debug , car je peux définir des points d'arrêt dans les fonctions définies dans d'autres cellules et exécuter la fonction dans une autre cellule. Jupyter/IPython accède au débogueur dans ma fonction où le point d'arrêt est défini et je peux utiliser les commandes habituelles pdb. À chacun ses goûts...

@ lugger1, la réponse acceptée est déconseillée.

9
Dale Smith