Un debugger dans Python pour voir précisément ce qui ce passe dans son code
Par Narann le mercredi, 25 novembre 2009, 23:27 - Script et code - Lien permanent
Haha!!! Le voila! Das Python Debugger! Le truc que "une fois que tu sais que ça existe que tu peut plus te passer de" ^^ .
Le debug, le genre de chose qu'un scripteur de base (moi :baffed: ) traduit par l'utilisation à tout va de "print" dont il asperge ses codes pour tenter de deviner "pourquoi de p*tain de script de m*rde ne fait pas qu'est ce qu'on lui à demandé de faire".
Et bien amis boutonneux pythonneux du dimanche, je viens de trouver une solution de la mort qui tue: Le module pdb!
Mieux que le print, et aussi simple à utiliser que lui, il vous permet (entre autre) de stopper votre code python (le mettre en pause) et de vous donner la mains. A partir de ce moment là, vous pouvez exécuter n'importe quel ligne de code (tel qu'un print($mavariable) par exemple), et/ou de continuer, ligne à ligne, l'exécution du code. Les bases du debug en somme...
Que du bonheur! :youplaBoum:
Avant toute chose
Je vais éviter de parler de pile d'appel (stack) ou quoi que ce soit dans la mesure ou on reste sur du debug "de base".
Je ne parlerai pas non plus du debugage dit "post-mortem" car il est dans la documentation (et que je ne m'en sert pas).
La documentation
Voici le liens vers la documentation officiel (elle est très courte et simple à comprendre pour qui à déjà une idée de comment fonctionne un scrit...):
http://docs.python.org/library/pdb.html
Utilisation
Comme d'habitude avec Python, on importe le module en début de code:
import pdb
Puis on place un breakpoint dans notre code, où on veux:
pdb.set_trace()
Cette procédure stop le programme et "ouvre le debugger". C'est la procédure que j'utilise le plus (la seul en fait). :hehe:
Dès que l'interpréteur arrivera au breakpoint, vous pourrez éxécutez d'autres commandes pour, par exemple, modifier ou vérifier la valeur d'une variable.
Application
Il n'est pas aisé de faire une explication de comment s'utilise un debugger tellement son utilisation dépend du problème qu'on souhaite solver.
Je vais prendre un exemple simple ou on souhaite modifier une variable afin de forcer un cas particulier.
Soit le script python suivant:
import pdb def debugDemoEntreEnDiscotheque(chaussures): #pdb.set_trace() #breakpoint if(chaussures == "barkers"): print("Tu peut rentrer car tes chaussures sont des "+chaussures) if(chaussures == "nikes"): print("Tu peut pas rentrer avec tes chaussures "+chaussures) debugDemoEntreEnDiscotheque("nikes")
Le resultat de ce code sera:
Tu peut pas rentrer avec tes chaussures nikes
L'idée vous l'aurez compris est de rentrer avec les chaussures qu'on veux. Commençons par décommenter la ligne:
pdb.set_trace() #breakpoint
Puis relançons le code:
> c:\demo\demo.py(7)debugDemoEntreEnDiscotheque() -> if(chaussures == "barkers"): (Pdb)
Le programme est stoppé vous pouvez maintenant faire ce que vous voulez...
La ligne:
> c:\demo\demo.py(7)debugDemoEntreEnDiscotheque()
Est le chemin du script ainsi que la ligne à laquelle nous somme et le nom de la procédure.
La ligne:
-> if(chaussures == "barkers"):
Est la ligne suivante. Nous somme donc juste au dessus d'elle.
Dans un premier temps, on va vérifier que contient la variable "chaussures", tapez:
(Pdb) print(chaussures) 'nikes'
Bon, à priori on va avoir du mal à entrer dans cette boucle là.
Tapez:
(Pdb) next
Puis validez.
> c:\demo\demo.py(10)debugDemoEntreEnDiscotheque() -> if(chaussures == "nikes"): (Pdb)
Oh! Il a sauté la boucle! En effet, next est une commande du debugger qui permet de passer à l'instruction suivante, d'avancer dans notre programme. Pour vous donner une idée simple, si vous faite que des "next", c'est comme si vous exécutiez votre programme normalement...
Les commandes du debugger
Pourquoi je m'arrête ici? Pour vous présenter les principales commandes du debuggers. c'est elles qui permettent de récupérer des informations et de naviguer dans votre programme. La plupars sont abrégé pour vous permettre de gagner du temps. Par exemple, au lieu de taper "next", vous pouvez taper "n".
Plus fort encore! Valider une commande vide répète la dernière commande exécuté par le debugger. Validez donc la ligne vide:
> c:\demo\demo.py(11)debugDemoEntreEnDiscotheque() -> print("Tu peut pas rentrer avec tes chaussures "+chaussures) (Pdb)
C'est le moment de jouer aux cons. La prochaine ligne va vous afficher la marque de vos chaussures. On va donc modifier la valeur:
(Pdb) chaussures = "barkers"
Validez, vous venez d'exécuter une commande et le debugger attend toujours avant de passer à la suite. Tapez "n" puis revalidez:
-> print("Tu peut pas rentrer avec tes chaussures "+chaussures) (Pdb) chaussures = "barkers" (Pdb) n Tu peut pas rentrer avec tes chaussures barkers
On est bien avancé. Recommencez et essayé de rentrer avec vos chaussures "nikes":
> c:\documents and settings\dorian.fevrier\desktop\demo.py(7)debugDemoEntreEnDiscotheque() -> if(chaussures == "barkers"): (Pdb) chaussures = "barkers" (Pdb) n > c:\documents and settings\dorian.fevrier\desktop\demo.py(8)debugDemoEntreEnDiscotheque() -> print("Tu peut rentrer car tes chaussures sont des "+chaussures) (Pdb) chaussures = "nikes" (Pdb) c Tu peut rentrer car tes chaussures sont des nikes Tu peut pas rentrer avec tes chaussures nikes
Paf! Collé le script! Pour le coups, j'ai aussi réussi à entrer dans le second "if" car les deux conditions se sont révélé vrai.
La commande "c" continue l'exécution du code et ne s'arrête que quand un autre breakpoint (set_trace) est rencontré. Ici, il me fini le programme.
Je ne vais pas répéter la documentation qui est déjà très simple à comprendre pour expliquer chaque commande du debugger.
Avec Maya
Et bien oui! Cela marche aussi avec Maya. Vous aurez des choses assez... Rigolotes...
Le problème c'est qu'il est absolument impossible de cliquer ailleurs que dans la fenêtre. :gne: Vous ne pouvez donc pas copier coller le nom de vos variables... En cas de "gros" debug, je vous invite très fortement à avoir à coté de vous un petit fichier texte avec les mots que vous êtes amené à taper régulièrement (print, nom des variables, etc...).
J'espère cependant que ce petit tuto vous permettra de débugger plus rapidement vos scripts. Et de faire des pipeline de qualité! :baffed:
A bientôt!
Commentaires
tu peux pas rentrer car tu fais des footess d'aurtograffe !
je suis d'accord avec: l'essayer c'est l'adopter
et quand tu couple ca avec "_ _ debug _ _" et assert
c'est royaldelabalquitue
puis en production un -O et hop plus rien!!!!
python c'est bon.....
l'idée de retourner faire du php m'herisse a block
Et sinon, plus simple:
python -m pdb monscriptquiput.py
et là, on entre en mode "commande" de debug (next, continue, where, pp, return, jump...) et c'est encore plus cool
Cool! Merci pour l'info! :)
Enfin des tutos pour débutants, faits par un débutant, et un exellent pédagogue; Qui a l'humilité de dire quand il ne comprend pas.
Sur la méga chiée de tutos que je me suis ingurgités.
Je peux affirmer que les tiens sont de loin les meilleurs.
Si tu ne connais pas le blog de Sam et Max, va y voir.
Le niveau est un peu hard, mais ils sont bons, bien qu'un peu branleurs (boulette par ci boulette par là) ....à+
Et comme les dev de haut niveau, ils ont un peu de mal à se baisser au niveau des débutants.
Mais on n'a jamais trop de sources....
Content que mon tuto t'ait plu! :)
Sam et Max je connais et j'aime bien leur coté un peu nerd. J'ai aussi la façon qu'ils ont de surenchérir, que ce soit sur la technique ou parfois même dans leur manière de "parler". :D