utilisation d'ipdb pour déboguer le code python dans une cellule (jupyter ou Ipython)

J'utilise Jupyter (ou Ipython) notebook avec firefox, et je veux déboguer du code python dans la cellule. Je suis " importer ipdb; ipdb.set_trace () ' comme type 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 l'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 apparaît si j'utilise ce code non pas dans le bloc-notes jupyter dans le 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, étape par étape, en utilisant ensuite, continuez, etc commandes de l'apb débogueur?

46
demandé sur lugger1 2016-02-25 00:14:12

4 réponses

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

La Solution consiste à l'utiliser à la place de l'appel de la bibliothèque ipdb set_trace:

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: la capture d'écran illustre comment Tracer () () fera réagir Jupyter notebook. Il interrompt l'exécution sur la ligne de votre code où vous tracez () () et une nouvelle entrée "inline" accepte les commandes ipdb comme 'p' ou ' n 'ou ' c', montrées ici

80
répondu Robert Muil 2017-06-05 16:11:21

Si vous utilisez Jupyter Notebook commencez votre cellule avec la commande magique " % % debug ". Ensuite, une ligne ipdb sera affichée au bas de la cellule, ce qui vous aidera à naviguer dans la session de débogage. Commandes suivantes devraient vous aider à démarrer:

N- exécute la ligne actuelle et passe à la ligne suivante.

C- continuer l'exécution jusqu'au prochain point d'arrêt.

Assurez-vous de redémarrer le noyau chaque fois que vous décidez du débogage, de sorte que toutes les variables soient fraîchement assigner.Vous pouvez vérifier la valeur de chaque variable via la ligne ipdb et vous verrez que la variable n'est pas définie jusqu'à ce que vous exécutiez la ligne qui attribue une 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')
10
répondu Aseem 2017-05-12 05:41:05

MA version de Jupyter est 5.0.0 et ma version IPython correspondante est 6.1.0. Je suis à l'aide de

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 a obtenu une erreur:

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

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

@lugger1, la réponse acceptée est obsolète.

8
répondu Dale Smith 2017-06-22 11:54:27

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 l'APB intégré.

Source

7
répondu Mattijn 2017-11-23 08:56:34