2017-09-29 8 views
2

J'essaye de déboguer du code dans un cahier de Jupyter. J'ai essayé 4 méthodes différentes, et ils souffrent tous du même problème:Les débogueurs n'agissent pas correctement sur les ordinateurs portables Jupyter

--Return-- 
None 
> <ipython-input-22-04c6f5c205d1>(3)<module>() 
     1 import IPython.core.debugger as dbg 
     2 dber = dbg.Tracer() 
----> 3 dber() 
     4 tst = huh.plot(ret_params=True) 
     5 type(tst) 

ipdb> n 
> y:\miniconda\lib\site-packages\ipython\core\interactiveshell.py(2884)run_code() 
    2882    finally: 
    2883     # Reset our crash handler in place 
-> 2884     sys.excepthook = old_excepthook 
    2885   except SystemExit as e: 
    2886    if result is not None: 

comme vous pouvez le voir, la commande n, qui, de ce que je compris de la documentation pdb doit exécuter la ligne suivante (Je suppose ipdb est juste pdb adapté pour travailler sur IPython, d'autant plus que je ne peux pas trouver toute la documentation de commande qui se réfère spécifiquement à ipdb et non pdb)

s a aussi le même problème. C'est en fait ce que je veux faire - entrer dans l'appel plot (d'après ce que je comprends, c'est ce que s est censé faire), mais ce que je reçois est exactement le même que ce que je reçois de n. J'ai aussi essayé r et j'ai le même problème. Chaque exemple que j'ai vu utilise juste Tracer()() ou IPython.core.debugger.PDB().set_trace() pour définir un point d'arrêt dans la ligne qui suit la commande, mais les deux provoquent les mêmes problèmes (et, je suppose, sont en fait exactement la même chose).

J'ai aussi essayé %debug (MultipleInstanceError) et %%debug (ne montre pas le code dans la ligne en cours d'exécution - dit juste ce que la ligne, à l'aide s ne marchez pas dans la fonction, exécute uniquement la ligne). Edit: se révèle, selon un blog d'avril de cette année, plaine pdb devrait également fonctionner. Il ne me permet de déboguer de manière interactive l'ordinateur portable, mais il imprime uniquement la ligne courante débogué (probablement pas un bug), et il a le même problème que IPython de set_trace() et Tracer()()

sur la console IPython plaine, IPython de set_trace (seulement celui que j'ai testé) fonctionne très bien.

Répondre

0

J'ai rencontré le même problème lors du débogage dans Jupyter Notebook. Ce qui fonctionne pour moi cependant, c'est quand j'appelle set_trace() à l'intérieur d'une fonction. Pourquoi est expliqué ici (click), bien que je ne comprends pas vraiment pourquoi d'autres ne rencontrent pas ce problème. Quoi qu'il en soit, si vous avez besoin d'une solution pragmatique pour votre problème et que vous voulez déboguer une fonction écrite auto, essayez ceci:

from IPython.core.debugger import set_trace 

def thisfunction(x): 
    set_trace()  # start debugging when calling the function 
    x += 2 
    return x 

thisfunction(5)  # ipdb console opens and I can use 'n' 

enter image description here

Maintenant, je peux utiliser « n » et le processus de débogage exécute la ligne suivante sans problèmes. Si j'utilise le code suivant, cependant, je rencontre votre problème mentionné ci-dessus.

from IPython.core.debugger import set_trace 

def thisfunction(x): 
    x += 2 
    return x 

set_trace()   # start debugging before calling the function. 
         # Calling 's' in the ipdb console to step inside "thisfunction" produces an error 
thisfunction(5)   

enter image description here

Hope this helps jusqu'à ce que quelqu'un pourrait résoudre complètement le problème.