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?
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/
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')
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.
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é.