web-dev-qa-db-fra.com

Comment parcourir le code Python pour résoudre les problèmes de débogage?

En Java/C #, vous pouvez facilement parcourir le code pour identifier les problèmes éventuels et les IDE rendent ce processus très convivial.

Pouvez-vous suivre le code python de la même manière?

130
Blankman

Oui! Il existe un débogueur Python appelé pdb rien que pour ça!

Vous pouvez lancer un programme Python via pdb en utilisant pdb myscript.py ou python -m pdb myscript.py.

Vous pouvez ensuite exécuter quelques commandes, qui sont décrites dans la page pdb .

Certains utiles à retenir sont:

  • b: définir un point d'arrêt
  • c: continue le débogage jusqu'à ce que vous atteigniez un point d'arrêt
  • s: parcourir le code
  • n: pour aller à la ligne suivante du code
  • l: liste le code source du fichier actuel (par défaut: 11 lignes, y compris la ligne en cours d'exécution)
  • u: naviguer dans un cadre de pile
  • d: naviguer dans un cadre de pile
  • p: pour imprimer la valeur d'une expression dans le contexte actuel

Si vous ne souhaitez pas utiliser un débogueur de ligne de commande, certains IDE tels que Pydev ont un débogueur d'interface graphique.

192
user193476

En utilisant le débogueur interactif Python 'pdb'

La première étape consiste à faire en sorte que l'interpréteur Python passe en mode débogage.

A. À partir de la ligne de commande

Voie la plus simple, depuis la ligne de commande, de l'interpréteur python

$ python -m pdb scriptName.py
> .../pdb_script.py(7)<module>()
-> """
(Pdb)

B. Au sein de l'interprète

Tout en développant les premières versions de modules et de l'expérimenter de manière plus itérative.

$ python
Python 2.7 (r27:82508, Jul  3 2010, 21:12:11)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb_script
>>> import pdb
>>> pdb.run('pdb_script.MyObj(5).go()')
> <string>(1)<module>()
(Pdb)

C. Dans votre programme

Pour un grand projet et un module long, vous pouvez lancer le débogage depuis le programme en utilisant import pdb et set_trace () Comme ceci:

#!/usr/bin/env python
# encoding: utf-8
#

import pdb

class MyObj(object):
    count = 5
    def __init__(self):
        self.count= 9

    def go(self):
        for i in range(self.count):
            pdb.set_trace()
            print i
        return

if __== '__main__':
    MyObj(5).go()

Le débogage pas à pas pour aller dans plus interne

  1. Exécutez l'instruction suivante… avec “n” (next)

  2. Répéter la dernière commande de débogage… avec ENTREZ

  3. Tout quitter… avec “q” (quitter)

  4. Imprimer la valeur des variables… avec “p” (print)

    a) p a

  5. Désactiver l'invite (Pdb)… avec “c” (continuer)

  6. Voir où vous êtes… avec “l” (liste)

  7. Entrer dans les sous-programmes… avec “s” (pas à pas)

  8. Continuer… mais juste jusqu'à la fin du sous-programme actuel… avec “r” (retour)

  9. Attribuer une nouvelle valeur

    a) ! b = "B"

  10. Définir un point d'arrêt

    a) pause linge

    b) break functionname

    c) break nomfichier: linumber

  11. Point d'arrêt temporaire

    a) numéro de lin tbreak

  12. Point d'arrêt conditionnel

    a) numéro de linge en pause, état

Note: ** Toutes ces commandes doivent être exécutées à partir de ** pdb

Pour une connaissance approfondie, voir: -

https://pymotw.com/2/pdb/

https://pythonconquerstheuniverse.wordpress.com/2009/09/10/debugging-in-python/

38
akD

Il existe un module appelé 'pdb' en python. Au sommet de votre script python, vous faites

import pdb
pdb.set_trace()

et vous entrerez en mode débogage. Vous pouvez utiliser 's' pour vous déplacer, 'n' pour suivre la ligne suivante, comme vous le feriez avec le débogueur 'gdb'.

32
Senthil Kumaran

Si vous venez de Java/C #, votre meilleur choix serait d’utiliser Eclipse with Pydev . Cela vous donne un IDE entièrement fonctionnel avec le débogueur intégré. Je l’utilise aussi avec Django.

3
Liorsion

À partir de Python 3.7, vous pouvez utiliser la fonction intégrée breakpoint() pour entrer dans le débogueur: 

foo()
breakpoint()  # drop into the debugger at this point
bar()

Par défaut, breakpoint() importera pdb et appellera pdb.set_trace() . Cependant, vous pouvez contrôler le comportement du débogage via sys.breakpointhook() et utiliser la variable d'environnement PYTHONBREAKPOINT .

Voir PEP 553 pour plus d’informations.

3
Eugene Yarmash

Si vous voulez un IDE avec un débogueur intégré, essayez PyScripter .

2
kindall

Il existe de nos jours la méthode breakpoint(), qui remplace import pdb; pdb.set_trace().

Il a également plusieurs nouvelles fonctionnalités , telles que les variables d’environnement possibles.

2
johnnyheineken

ipdb

ipdb ajoute la fonctionnalité IPython à pdb, offrant les améliorations énormes suivantes:

  • onglet complétion
  • montrer plus de lignes de contexte
  • mise en évidence de la syntaxe

L'utilisation est analogue à pdb, il suffit de l'installer avec:

python3 -m pip install --user ipdb

puis ajoutez à la ligne que vous souhaitez utiliser le débogage:

__import__('ipdb').set_trace(context=21)

Vous voudrez probablement ajouter un raccourci pour cela à partir de votre éditeur, par exemple. pour Vim snipmate j'ai:

snippet ipd
    __import__('ipdb').set_trace(context=21)

afin que je puisse taper simplement ipd<tab> et il se développe au point d'arrêt. Ensuite, il est facile de le supprimer avec dd car tout est contenu dans une seule ligne.

context=21 augmente le nombre de lignes de contexte, comme expliqué à: Comment puis-je faire en sorte que ipdb affiche plus de lignes de contexte pendant le débogage?

Vous pouvez également déboguer des programmes depuis le début avec:

ipdb3 main.py

mais vous ne voulez généralement pas faire cela parce que:

  • vous devrez passer par toutes les définitions de fonctions et de classes lorsque Python lit ces lignes
  • Je ne sais pas comment définir la taille du contexte sans pirater ipdb. Patch permettant cela: https://github.com/gotcha/ipdb/pull/155

Ou alternativement, comme dans raw pdb 3.2+, vous pouvez définir des points d'arrêt à partir de la ligne de commande:

ipdb3 -c 'b 12' -c 'b myfunc' ~/test/a.py

bien que -c c soit cassé pour une raison quelconque: https://github.com/gotcha/ipdb/issues/156

La complétion par tabulation fonctionne alors avec Tab comme dans IPython.

Tout comme pdg, ipdb est encore loin d’être parfait et complètement rudimentaire par rapport à GDB, mais c’est déjà une énorme amélioration par rapport à pdb.

python -m module le débogage a été demandé à l'adresse: Comment déboguer un module Python exécuté avec python -m à partir de la ligne de commande? et puisque Python 3.7 peut être fait avec:

python -m pdb -m my_module

Caractéristiques manquantes graves de pdb et ipdb par rapport à GDB:

Testé sous Ubuntu 16.04, ipdb == 0.11, Python 3.5.2.

1
Aaron Hoffman

Il est également possible de suivre et de parcourir par code le code python (et sa simplicité!) Consultez la documentation sys.settrace () pour plus de détails. Aussi ici est un tutoriel pour vous aider à démarrer.

1
Autodidact

https://wiki.python.org/moin/PythonDebuggingTools

pudb est un bon remplaçant pour pdb

1
Neil

Python Tutor est un débogueur en ligne à étape unique. Vous pouvez mettre du code sur la page edit puis cliquer sur "Visualiser l'exécution" pour le lancer.

0
wjandrea

PyCharm est un IDE pour Python qui inclut un débogueur. Regardez cette vidéo sur YouTube pour une introduction à l'utilisation du débogueur de PyCharm pour parcourir le code.

Tutoriel PyCharm - Déboguer du code python avec PyCharm

Remarque: ceci n'est pas destiné à être une approbation ou une révision. PyCharm est un produit commercial payant, mais la société fournit une licence gratuite aux étudiants et aux enseignants, ainsi qu'une version "allégée" de la communauté, gratuite et à code source ouvert. 

 Screenshot

0
jim