web-dev-qa-db-fra.com

Quelle est la bonne façon de déboguer dans un ordinateur portable iPython?

Comme je le sais, %debug magic peut effectuer un 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 %debug dans la première ligne de la cellule-1. Mais il entre immédiatement en mode débogage, même avant l'exécution de la cellule 2. 

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

Quelle est la bonne façon de définir un point de rupture dans le cahier ipython?

89
Rex

Utilisez 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 n et pour entrer dans une utilisation de la fonction s et quitter le débogage c.

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

60
Tevin Joseph K O

Vous pouvez utiliser ipdb inside jupyter avec:

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


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

from IPython.core.debugger import set_trace

Ajoutez set_trace() où vous avez besoin d'un point d'arrêt. Tapez help pour les commandes ipdb lorsque le champ de saisie apparaît.

81
Leopd

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

%%debug 

au lieu de

%debug 

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

11
Mohit Khurana

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)
8
krock

Il suffit de taper import pdb dans le cahier jupyter, puis d’utiliser ce cheatsheet pour déboguer. C'est très pratique.

c -> continuer, s -> step, 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:  enter image description here  enter image description here

6
flowera

La commande magique %pdb est également utile. Il suffit de dire %pdb on et par la suite le débogueur pdb s'exécutera sur toutes les exceptions, quelle que soit la profondeur de la pile d'appels. Très utile.

Si vous souhaitez déboguer une ligne particulière, il vous suffit de déclencher une exception (vous l'avez déjà souvent!) Ou d'utiliser la commande magique %debug proposée par d'autres personnes.

4
waterproof

Dans Python 3.7, vous pouvez utiliser breakpoint () function. Il suffit d'entrer 

breakpoint()

où que vous vouliez 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
Vlad Bezden

Après avoir obtenu une erreur, dans la cellule suivante, exécutez simplement %debug et le tour est joué.

2
Escachator

Je viens de découvrir PixieDebugger . Même si je n'ai pas encore eu le temps de le tester, il semble vraiment que la façon la plus similaire de déboguer telle que nous l'utilisons dans ipython avec ipdb

 enter image description here

Il a également un onglet "évaluer"

0
Alessandro Dentella