Quels sont vos meilleurs conseils pour déboguer Python?
Veuillez ne pas simplement lister un débogueur particulier sans dire ce qu'il peut réellement faire.
en relation
- Quels sont les bons moyens de faire exécuter mon code Python pour la première fois? - Cela traite de la minimisation des erreurs
Réponses:
PDB
Vous pouvez utiliser le module pdb, insérer
pdb.set_trace()
n'importe où et il fonctionnera comme un point d'arrêt.Pour continuer l'exécution, utilisez
c
(oucont
oucontinue
).Il est possible d'exécuter des expressions Python arbitraires en utilisant pdb. Par exemple, si vous trouvez une erreur, vous pouvez corriger le code, puis tapez une expression de type pour avoir le même effet dans le code en cours d'exécution
ipdb est une version de pdb pour IPython . Il permet l'utilisation de pdb avec toutes les fonctionnalités IPython, y compris la complétion des onglets.
Il est également possible de configurer pdb pour qu'il s'exécute automatiquement sur une exception non interceptée.
Pydb a été écrit pour être une version améliorée de Pdb. Avantages?
la source
myserver.com/pdb
en mode débogage qui fait simplementimport pdb; pdb.set_trace()
. Si vous utilisez Flask / Werkzeug qui a un débogueur interactif, vous pouvez également avoir une vue qui fait justeassert False
.http://pypi.python.org/pypi/pudb , un débogueur Python plein écran basé sur une console.
Bien pour le débogage de scripts autonomes, exécutez simplement
la source
pip install pudb
Si vous utilisez pdb, vous pouvez définir des alias pour les raccourcis. J'utilise ceux-ci:
la source
Enregistrement
Python a déjà un excellent module de journalisation intégré . Vous pouvez utiliser le modèle de journalisation ici .
Le module de journalisation vous permet de spécifier un niveau d'importance; pendant le débogage, vous pouvez tout consigner, tandis que pendant le fonctionnement normal, vous ne pouvez consigner que les éléments critiques. Vous pouvez éteindre et rallumer les choses.
La plupart des gens utilisent simplement des instructions d'impression de base pour déboguer, puis suppriment les instructions d'impression. Il est préférable de les laisser, mais de les désactiver; puis, lorsque vous avez un autre bogue, vous pouvez simplement tout réactiver et consulter vos journaux.
Cela peut être le meilleur moyen possible de déboguer les programmes qui doivent faire les choses rapidement, tels que les programmes de mise en réseau qui doivent répondre avant que l'autre extrémité de la connexion réseau expire et disparaisse. Vous n'aurez peut-être pas beaucoup de temps pour un débogueur en une seule étape; mais vous pouvez simplement laisser votre code s'exécuter, tout consigner, puis parcourir les journaux et comprendre ce qui se passe réellement.
EDIT: L'URL d'origine des modèles était: http://aymanh.com/python-debugging-techniques
Cette page est manquante, je l'ai donc remplacée par une référence à l'instantané enregistré sur archive.org: http://web.archive.org/web/20120819135307/http://aymanh.com/python-debugging-techniques
Au cas où il disparaîtrait à nouveau, voici les modèles que j'ai mentionnés. C'est du code tiré du blog; Je ne l'ai pas écrit.
Et voici son explication sur la façon d'utiliser ce qui précède. Encore une fois, je n'en ai pas le mérite:
Par défaut, le module de journalisation imprime les messages critiques, d'erreur et d'avertissement. Pour changer cela afin que tous les niveaux soient imprimés, utilisez:
Pour envoyer des messages de journal à un fichier appelé debug.log, utilisez:
la source
Il est possible d'imprimer quelles lignes Python sont exécutées (merci Geo!). Cela a n'importe quel nombre d'applications, par exemple, vous pouvez le modifier pour vérifier quand des fonctions particulières sont appelées ou ajouter quelque chose comme ## pour ne suivre que des lignes particulières.
code.interact vous emmène dans une console interactive
Si vous voulez pouvoir accéder facilement à l'historique de votre console, regardez: " Puis-je avoir un mécanisme d'historique comme dans le shell? " (Il faudra le chercher).
La saisie semi-automatique peut être activée pour l' interpréteur .
la source
ipdb est comme pdb, avec la génialité d'ipython.
la source
print
déclarationsdebug_print
fonction au lieu d'imprimer pour une désactivation facilepprint
module est inestimable pour les structures complexesla source
la manière évidente de déboguer un script
si vous ne savez pas exactement où se trouve ce script
la source
PyDev
PyDev a un très bon débogueur interactif. Il contient des expressions de surveillance, un survol pour évaluer, des listes de threads et de piles et (presque) toutes les commodités habituelles que vous attendez d'un débogueur visuel moderne. Vous pouvez même vous attacher à un processus en cours d'exécution et effectuer un débogage à distance.
Comme d'autres débogueurs visuels, cependant, je le trouve utile surtout pour des problèmes simples, ou pour des problèmes très compliqués après avoir tout essayé. Je fais encore la plupart des gros travaux de journalisation.
la source
Si vous connaissez Visual Studio, Python Tools pour Visual Studio est ce que vous recherchez.
la source
Winpdb est très sympa, et contrairement à son nom, il est complètement multiplateforme.
Il a un très bon débogueur basé sur une invite et une interface graphique, et prend en charge le débogage à distance.
la source
Dans Vim, j'ai ces trois liaisons:
rpdb2
est un débogueur Python distant, qui peut être utilisé avec WinPDB, un débogueur graphique solide. Parce que je sais que vous allez demander, il peut faire tout ce que j'attends d'un débogueur graphique :)J'utilise
pdb
fromnose.tools
afin de pouvoir déboguer les tests unitaires ainsi que le code normal.Enfin, le
F7
mappage imprimera un suivi (similaire au type que vous obtenez lorsqu'une exception apparaît en haut de la pile). Je l'ai trouvé très utile plus de quelques fois.la source
Définir des méthodes utiles repr () pour vos classes (afin que vous puissiez voir ce qu'est un objet) et utiliser repr () ou "% r"% (...) ou "... {0! R} ..". Format (...) dans vos messages / journaux de débogage est IMHO une clé pour un débogage efficace.
De plus, les débogueurs mentionnés dans d'autres réponses utiliseront les méthodes repr ().
la source
Obtenir une trace de pile à partir d'une application Python en cours d'exécution
Il y a plusieurs astuces ici . Ceux-ci inclus
la source
Si vous n'aimez pas passer du temps dans les débogueurs (et n'appréciez pas la mauvaise utilisation de l'
pdb
interface de ligne de commande), vous pouvez vider la trace d' exécution et l'analyser plus tard. Par exemple:Cela videra toute la ligne d'
setup.py install
exécution source dansexecution.log
.Pour faciliter la personnalisation de la sortie de trace et écrire vos propres traceurs, j'ai rassemblé quelques morceaux de code dans le module xtrace (domaine public).
la source
Lorsque cela est possible, je débogue en utilisant
M-x pdb
dans emacs pour le débogage au niveau source.la source
Il existe un cours en ligne complet appelé " Débogage de logiciels " par Andreas Zeller sur Udacity, contenant des conseils sur le débogage:
Hautement recommandé.
la source
si vous voulez une belle façon graphique d'imprimer votre pile d'appels de manière lisible, consultez cet utilitaire: https://github.com/joerick/pyinstrument
Exécuter à partir de la ligne de commande:
Exécuter en tant que module:
Exécutez avec django:
Ajoutez simplement
pyinstrument.middleware.ProfilerMiddleware
àMIDDLEWARE_CLASSES
, puis ajoutez?profile
à la fin de l'URL de demande pour activer le profileur.la source