Quelle est la bonne façon de déboguer dans le notebook iPython?


121

Comme je le sais, %debug magic peut faire le débogage dans une cellule.

Cependant, j'ai des appels de fonction sur plusieurs cellules.

Par exemple,

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

Ce que j'ai essayé:

  1. J'ai essayé de définir %debugdans la première ligne de cell-1. Mais il entre en mode débogage immédiatement, avant même d'exécuter cell-2.

  2. J'ai essayé d'ajouter %debugla ligne juste avant le code return do_some_thing_about(b). Mais alors le code s'exécute pour toujours, ne s'arrête jamais.

Quelle est la bonne façon de définir un point d'arrêt dans le bloc-notes ipython?

Réponses:


72

Utiliser ipdb

Installez-le via

pip install ipdb

Usage:

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)

Pour exécuter une utilisation ligne par ligne net pour accéder à une fonction, utiliser set quitter l'invite de débogage c.

Pour la liste complète des commandes disponibles: https://appletree.or.kr/quick_reference_cards/Python/Python%20Debugger%20Cheatsheet.pdf


ipdb ne me donne pas l'invite de débogage dans l'autre cellule avec l'exemple de code mentionné dans la question. Maintenant, le code continue de fonctionner pour toujours.
Rex

@Rex Pour moi, ça marche. Où avez-vous mis ipdb? Mettez import ipdb; ipdb.set_trace (); avant la ligne retourne do_some_thing_about (b). Ensuite, appelez fun1 (a) à partir de la deuxième cellule, cela devrait fonctionner. Pour quitter l'invite de débogage, utilisez 'c'
Tevin Joseph KO

@Rex a mis à jour la réponse pour plus de clarté.
Tevin Joseph KO

29
Cela fonctionne dans la console iPython mais pas dans le bloc-notes iPython (c'est ce que la question a posée). Quand je tape import ipdb; ipdb.set_trace()dans une cellule de cahier, il ditMultipleInstanceError: Multiple incompatible subclass instances of TerminalIPythonApp are being created.
Bill

1
nouveau pour jupyter ... il semble qu'il soit plus approprié pour la présentation et le partage d'extraits de code ... pouvons-nous avoir des fonctionnalités que les IDE (comme eclipse, rstudio) fournissent comme le débogage réel, l'étape à travers, les points d'arrêt, l'ajout de montre à l'expression et variables etc. Au début, il semble que ce ne soit pas le cas, je veux juste être sûr .....
Mahesha999

90

Vous pouvez utiliser à l' ipdbintérieur de jupyter avec:

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

Edit : les fonctions ci-dessus sont obsolètes depuis IPython 5.1. Voici la nouvelle approche:

from IPython.core.debugger import set_trace

Ajoutez set_trace()là où vous avez besoin d'un point d'arrêt. Tapez helppour les ipdbcommandes lorsque le champ de saisie apparaît.


20
Tracera été amorti. Maintenant, cela fonctionne de cette façon: from IPython.core.debugger import set_traceet set_trace()évoque un point d'arrêt. Source: davidhamann.de/2017/04/22/debugging-jupyter-notebooks
Anton Tarasenko

1
Pratique à utiliser comme une seule ligne, partout où c'est nécessaire:from IPython.core.debugger import set_trace;set_trace()
Nir

15

Votre fonction de retour est en ligne avec la fonction def (fonction principale), vous devez lui donner un onglet. Et utilise

%%debug 

au lieu de

%debug 

pour déboguer la cellule entière non seulement la ligne. J'espère que cela vous aidera peut-être.


12

Vous pouvez toujours ajouter ceci dans n'importe quelle cellule:

import pdb; pdb.set_trace()

et le débogueur s'arrêtera sur cette ligne. Par exemple:

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

In[2]: fun1(1)

Cela devrait-il être ipdb?
Rex

1
@Rex Pas nécessairement. ipdbest un refactor du débogueur Python qui est plus étroitement intégré à IPython. pdbest intégré.
Two-Bit Alchemist

ipdbpeut également être utilisé en dehors du shell ipython et est livré avec certaines commodités telles que l'achèvement des onglets.
Jan

12

En Python 3.7, vous pouvez utiliser la fonction breakpoint () . Entrez simplement

breakpoint()

partout où vous souhaitez que l'exécution s'arrête et à partir de là, vous pouvez utiliser les mêmes commandes pdb (r, c, n, ...) ou évaluer vos variables.


2
Pour ajouter à cela, lorsque vous appelez breakpoint (), vous pouvez taper «help» dans la zone de texte qui apparaît pour obtenir une liste de commandes.
gbeaven

Il semble y avoir un problème persistant de raccrochage après l'utilisation de breakpoint () ou pdb
Dave Liu

8

Tapez import pdbsimplement le notebook jupyter, puis utilisez cette feuille de triche pour déboguer. C'est très pratique.

c-> continuer, s-> pas, b 12-> définir le point d'arrêt à la ligne 12 et ainsi de suite.

Quelques liens utiles: Document officiel Python sur pdb , exemples de débogueur Python pdb pour mieux comprendre comment utiliser les commandes du débogueur .

Quelques captures d'écran utiles: entrez la description de l'image icientrez la description de l'image ici


Bonne réponse. Cependant, je pense (je suis nouveau sur le notebook Jupyter) qu'il faut ajouter% debug pour définir un point d'arrêt.
Ad Infinitum du

Ce que je fais, c'est copier et coller pdb.set_trace()là où je veux définir un point d'arrêt, car le b line_none fonctionne pas dans Jupyter Notebook et fonctionne bien sur python IDLE.
flowera

Merci! J'ai également téléchargé quelques captures d'écran que j'ai testées aujourd'hui. Si je pouvais passer à Python IDLE, je serais ravi de le faire ..
flowera

En outre, je trouve un moyen d'afficher le numéro de ligne sur le notebook jupyter, cliquez sur une nouvelle ligne, puis appuyez sur L.Bien sûr, vous pouvez également programmer votre propre raccourci, des liens sont disponibles sur le site Web du notebook jupyter.
flowera

1
J'utilise toujours "p" pour afficher la liste des commandes dans le notebook Jupyter. Lorsque j'écris "afficher les numéros de ligne", la commande apparaît là avec le raccourci à côté. Vous pouvez également apprendre le raccourci de la commande que vous souhaitez utiliser.
Ad Infinitum

8

Après avoir obtenu une erreur, dans la cellule suivante, exécutez simplement %debuget c'est tout.


1
c'est génial!
Quelqu'un le

cependant, cela doit attendre que l'exception se produise, nous pourrions vouloir tester quelle est la variable dans le runtime en définissant un point d'arrêt
Luk Aron

7

La %pdbcommande magique est également bonne à utiliser. Dites simplement %pdb onet par la suite, le pdbdébogueur fonctionnera sur toutes les exceptions, quelle que soit la profondeur de la pile d'appels. Très utile.

Si vous avez une ligne particulière que vous souhaitez déboguer, il suffit de lever une exception à cet endroit (souvent vous l'êtes déjà!) Ou d'utiliser la %debugcommande magique suggérée par d'autres personnes.


5

Je viens de découvrir PixieDebugger . Même si je n'ai pas encore eu le temps de le tester, cela semble vraiment la manière la plus similaire de déboguer la façon dont nous sommes utilisés en ipython avec ipdb

entrez la description de l'image ici

Il a également un onglet "évaluer"


0

Un débogueur natif est mis à disposition en tant qu'extension de JupyterLab. Sorti il ​​y a quelques semaines, celui-ci peut être installé en obtenant l'extension appropriée, ainsi que le noyau xeus-python (qui vient notamment sans les magies bien connues des utilisateurs d'ipykernel):

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

Cela permet une expérience de débogage visuelle bien connue des autres IDE.

entrez la description de l'image ici

Source: un débogueur visuel pour Jupyter


xeus-python ne fonctionne pas sur mon Windows 10. Vérifiez mon problème Problème xeus-python sur github
sergzemsk
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.