Comment déboguer efficacement avec spyder en Python?

J'aime Python et j'aime Spyder mais je trouve le débogage avec Spyder terrible!

  • chaque fois que je mets un point de rupture, je dois appuyer sur deux boutons: d'abord le débogage, puis le bouton continuer (il s'arrête à la première ligne automatiquement) ce qui est gênant.
  • de plus, plutôt que d'avoir la console iPython standard avec auto completion etc j'ai une console IPDB>> moche qui n'est que des ordures.
  • le pire est que cette console gèle très fréquemment même si je écrivez des impressions ou une évaluation simple pour essayer de comprendre quel est le bug. C'est bien pire que matlab.
  • Last but not least, si j'appelle une fonction de l'intérieur du ipdb > > console, et mettre un point d'arrêt en elle, il ne s'arrêtera pas là. Il semble que je dois mettre le point d'arrêt avant de commencer le débogage (ctrl + F5).

Avez-vous une solution ou peut-être Pouvez-vous me dire comment déboguer les scripts et les fonctions python?

J'utilise une nouvelle installation D'Anaconda sur un Windows 8.1 64bit.

46
demandé sur Hanan Shteingart 2015-02-02 17:48:09

7 réponses

(Spyder dev ici ) Nous sommes conscients que L'expérience de débogage dans Spyder est loin d'être idéale. Ce que nous offrons en ce moment est très similaire au débogueur Python standard, mais nous travaillons à améliorer les choses dans notre prochaine version majeure pour fournir quelque chose de plus proche de ce que tout scientifique attend d'un débogueur (en bref, une console IPython régulière qui vous permet d'inspecter et de tracer des variables au point d'arrêt actuel).

Maintenant à propos de vos points:

  1. C'est vrai. Nous sommes penser à améliorer cela de sorte que si l'utilisateur appuie sur le bouton Exécuter, et il y a un point d'arrêt présent dans le fichier en cours, puis Spyder entre en mode Débogage et exécute le programme jusqu'à ce que le premier point d'arrêt est atteint.

  2. ipdb est la console du débogueur IPython. Malheureusement, en raison des limitations de L'architecture IPython, elle est très limitée (pas de complétion de code et pas de navigation d'historique avec des flèches). De plus, il n'est pas possible d'exécuter du code Python arbitraire dans ipdb ou un Console pdb régulière. Les commandes que vous pouvez exécuter dans ipdb sont ceux que vous pouvez lire lorsque évaluer la help commande à l'intérieur.

  3. C'est parce que, comme je l'ai dit, vous ne pouvez pas évaluer le code Python arbitraire.

  4. Vous devez mettre de nouveaux points d'arrêt dans notre éditeur afin qu'ils soient synchronisés avec nos consoles Python/IPython

34
répondu Carlos Cordoba 2015-02-02 19:57:32

Processus de débogage

, Vous devez comprendre qu'en fait, vous êtes à l'aide de différents intégration de la Python débogueur pdb et ipdb (qui utilise pdb et qui peut être consulté en utilisant le module ipdb) . J'espère que cet exemple trivial vous aidera à l'utiliser mieux.

Supposons que vous vouliez déboguer ce code:

def Waiting_fun():                      #1 line number one
    for i in range(100):                #2
        pass                            #3
                                        #4 
def New_sum(lista, to_s = False):       #5
    result = 0                          #6
    print 1                             #7
    for i in lista:                     #8
        print "summed"                  #9   
        result +=i                      #10
    Waiting_fun()                       #11
    if to_s:                            #12
        result = str(result)
    return result
a = New_sum([1,4,5,7,8])
b = New_sum([1,4],1)
c = 456
d = New_sum([6,8,9],1)
final_result = a*b*c*d
Out: Type error

Premier débogage rapide en utilisant iPython % debug

%debug

La première chose que je fais est d'appeler pdb de iPython en utilisant la commande magique %debug, Vous pouvez le Définir comme mécanisme par défaut en utilisant %pdb.

%debug
> /home/opdate/Desktop/test.py(23)<module>()
     19 a = New_sum([1,4,5,7,8])
     20 b = New_sum([1,4],1)
     21 c = 456
     22 d = New_sum([6,8,9],1)
---> 23 final_result = a*b*c*d

Une fois que vous déjeunez pdb. Vous pouvez trouver toutes les commandes dans les documents officiels ou vous pouvez utiliser la commande h pour les afficher. Dans cette étape, les seules commandes que j'utilise sont:

  • p : affiche les variables que vous spécifiez
  • pp: jolies impressions
  • args: Si vous êtes dans une fonction, elle affiche les arguments
  • pp locals() : peut être utile pour imprimer toutes les variables mais la plupart des le temps c'est un gâchis!
  • ! utiliser si vous voulez éviter les conflits avec les commandes listées dans h
  • whatis variable_name: équivalent du type (variable_name)
  • u: déplace le cadre actuel d'un niveau vers le haut dans la trace de la pile (vers un cadre plus ancien).
  • d: déplacez l'image actuelle d'un niveau vers le bas dans la trace de la pile (vers une image plus récente).
  • q : lorsque vous avez terminé, vous pouvez utiliser q pour quitter

Dans notre cas:

ipdb> pp a,b,c,d
(25, '5', 456, '23')

Ou ipdb> !a,b,c,d (pas d'espace entre le point d'esclamation et la première valeur). Il est clair que b et d sont des chaînes au cas où nous pourrions utiliser:

ipdb> whatis b
<type 'str'>

Aller plus loin en utilisant les points de rupture

70% des fois %debug vous indique la solution. Lorsque vous avez besoin de plus de fonctionnalités comme points d'arrêt est temps d'utiliser Spyder. Dans ce cas, nous voulons comprendre pourquoi b est une chaîne que nous mettons un point d'arrêt à côté de lui. Je trouve beaucoup mieux pour utiliser la console Python standard au lieu de la console IPython pour le débogage sélectionnez la console avant de commencer le débogage: entrez la description de l'image ici

, Puis ouvrez le variable explorer s'il y a des variables de les supprimer. J'utilise Ctrl+F5 pour démarrer le débogage, vous pouvez utiliser les boutons sur le dessus, mais je préfère utiliser leurs raccourcis indiqué ci-dessous:

entrez la description de l'image ici

(Pdb) c # we go to the breakpoint 
(Pdb) s # we step into the function
(Pdb) args # we see what parameters are inserted
(Pdb) s # going step-by-step
(Pdb) ⏎ # series of Enters go line by line quicker
#Here I'll use  whatis command but in fact I just look to
# the type in variable explorer of spyder.
(Pdb) whatis result #check if result is still int
(Pdb) unt #or until -useful to exiting from loops see doc.
(Pdb) n # we  don't  enter to the Waiting_fun function
(Pdb) s # going step-by-step
(Pdb) whatis result #we find that there the int is converted
(Pdb) j 6 # for double checking we jump back to 6 were the result is assigned 
# We may be tempted to j(ump) to line 12 but doing so we would skip all the code
#for avoiding a series of `s`,`unt` and `n` we can use this solution:
(Pdb) tbreak 12 #set a new temporary breakpoint. Also `b` it's ok most of the time
(Pdb) c  # go to it 
(Pdb) j 6 # we jump to 6 the code we jump is NOT executed
(Pdb) whatis result# we find that if we jump 12-13 result is still int

Maintenant, nous avons localisé l'erreur. Nous pouvons aussi tester un solution nous répétons l'étape jusqu'à 12 et nous définissons to_s = False

(Pdb) to_s = False #!to_s = False to be on the safe side

Ça marche. Une caractéristique importante en utilisant le pdb standard dans la console Python , est que vous avez la concurrence automatique et vous pouvez utiliser l'Explorateur de variables au lieu d'utiliser whatis et pp:

entrez la description de l'image ici

En utilisant l'Explorateur de variables, vous pouvez également modifier la valeur des variables, ce qui rend les choses encore plus rapides.

Conditionnel points d'arrêt

Une autre façon plus intelligente de localiser l'erreur est d'utiliser point d'arrêt conditionnel (décalage+F12) un grand avantage de Spyder est de déboguer et d'utiliser des points d'arrêt de liste. Les points d'arrêt conditionnels sont activés lorsque la condition est True dans notre cas, nous voulons localiser où b devient une chaîne de sorte que la condition est: type(b) == str. Je place habituellement beaucoup de points d'arrêt conditionnels et vois lequel répond à la condition. Pour ce faire ne pas utiliser Maj+F12 {[94] } mais placez les points d'arrêt normaux en double-cliquant à côté de la ligne et allez dans débogage->liste des points d'arrêt et copiez et dépassez la condition dans le tableau à chaque point d'arrêt comme indiqué dans la figure ci-dessous.

entrez la description de l'image ici

À partir de là, les commandes à utiliser sont:

(Pdb) c  # go to the first
(Pdb) u # it helps to understand when it happened
(Pdb) d # come back to the breakpoint
11
répondu G M 2017-12-04 13:24:01

Le débogueur pdb fonctionne très bien avec Python normal . Donc, dans Spyder, je passe juste à la console python chaque fois que je veux déboguer de manière interactive.

import pdb

def yourfunction():
    # Interesting stuff done here
    pdb.set_trace() 

Belle introduction au débogage avec pdb https://pythonconquerstheuniverse.wordpress.com/category/python-debugger/

4
répondu LtGlahn 2016-12-29 12:19:50

Voici comment je débogue dans Spyder afin d'éviter de geler l'IDE. Je le fais si je modifie le script en mode débogage.

  1. je ferme la console IPython (débogage) actuelle [x]
  2. Ouvrir un nouveau [barre de Menu - > Consoles - > ouvrir une Console IPython]
  3. Entrez à nouveau en mode débogage [bouton bleu Lecture pause].

Encore un peu ennuyeux, mais il a l'avantage supplémentaire d'effacer (réinitialiser) la liste des variables.

1
répondu oogieoogieful 2016-08-18 17:04:35

Un petit supplément concernant le point 3:

Il m'a également semblé que la console de débogage se figeait fréquemment, faisait des impressions, évaluait, etc., mais en appuyant sur le bouton stop (Exit debug), elle revenait généralement au bas de la pile d'appels et je pouvais ensuite remonter ('u') au cadre dans lequel je déboguais. Vaut la peine d'essayer. Cela pourrait être pour une version ultérieure de Spyder (2.3.5.2)

0
répondu Paul 2016-04-28 23:58:35

Vous pouvez utiliser les touches de raccourci de débogage comme: Étape Sur La Touche F10 Entrez Dans F11 dans outils>préférences>raccourcis clavier

0
répondu Mahyar 2018-03-19 19:08:37

Personne n'a jamais mentionné à propos de ces deux auparavant apparemment:

Avant Python, j'utilisais VBA. Bien que ce soit un langage relativement ancien qui n'est pas régulièrement mis à jour, une chose que J'aimais à propos de VBA était la fonction de débogage. Les 2 fonctions de débogage les plus proches de VBA ou qui peuvent également être qualifiées de "débogage visuel" que j'ai rencontrées sont:

1-Débogueur PyCharm

Cette vidéo de 6 minutes montre le débogueur PyCharm.

2-PixieDebugger - le débogueur Python visuel pour les ordinateurs portables Jupyter que vous avez toujours voulu

Comme de nombreux codeurs ont tendance à utiliser JupyterNotebook, ce débogueur serait utile. PixieDebugger est presque le même que PyCharm débogueur. Je n'entrerai pas dans les détails ici.

Mais vous pouvez vous référer à cette lien

0
répondu mcagriardic 2018-09-20 10:50:59