C'est une question que je me pose depuis longtemps, mais je n'ai jamais trouvé de solution appropriée. Si j'exécute un script et que je tombe sur, disons une IndexError, python affiche la ligne, l'emplacement et une description rapide de l'erreur et quitte. Est-il possible de démarrer automatiquement pdb en cas d'erreur? Je ne suis pas contre avoir une déclaration d'importation supplémentaire en haut du fichier, ni quelques lignes de code supplémentaires.
216
Réponses:
Vous pouvez utiliser traceback.print_exc pour imprimer les exceptions traceback. Utilisez ensuite sys.exc_info pour extraire le traceback et enfin appeler pdb.post_mortem avec ce traceback
Si vous souhaitez démarrer une ligne de commande interactive avec code.interact en utilisant les paramètres régionaux du cadre d'où provient l'exception, vous pouvez le faire
la source
code
pluspdb
puisque ce dernier semble se développer sur l'ancien?code
?sys.exc_info
pour extraire le traçage et enfin appelerpdb.post_mortem
avec ce traçage . Vous n'avez pas besoin de passer l'objet traceback àpdb.post_mortem
. À partir des documents : si aucun traceback n'est fourni, il utilise celui de l'exception qui est actuellement gérée (une exception doit être gérée si la valeur par défaut doit être utilisée).Si vous ne fournissez pas l'
-c continue
indicateur, vous devrez entrer «c» (pour Continuer) lorsque l'exécution commencera. Ensuite, il s'exécutera au point d'erreur et vous donnera le contrôle. Comme mentionné par eqzx , cet indicateur est un nouvel ajout en python 3.2, donc la saisie de «c» est requise pour les versions antérieures de Python (voir https://docs.python.org/3/library/pdb.html ).la source
gdb
; et lorsque vous entrez «r» danspdb
, le programme s'exécute en effet, mais ne s'arrête pas (ni ne génère de trace) en cas d'erreur; m'a laissé perplexe jusqu'à ce que je lise ceci. À votre santé!ipdb
; et bien sûr, des arguments peuvent être ajoutés après le script!Utilisez le module suivant:
Nommez-le
debug
(ou ce que vous voulez) et placez-le quelque part dans votre chemin python.Maintenant, au début de votre script, ajoutez simplement un
import debug
.la source
try-catch
qui est juste laid IMO.pudb
pluspdb
. Continuez à revenir au copier-coller, ce qui en dit sûrement quelque chose sur le manque d'ordre dans ma vie.Ipython a une commande pour basculer ce comportement: % pdb . Il fait exactement ce que vous avez décrit, peut-être même un peu plus (vous donnant des tracés plus informatifs avec mise en évidence de la syntaxe et complétion du code). Cela vaut vraiment la peine d'essayer!
la source
%debug
permet d'ouvrir le débogueur après avoir rencontré une erreur. Je préfère souvent cela%pdb
. (Le compromis est simplement taperq
chaque fois que vous ne voulez pas déboguer un rapport d'erreur en tapant%debug
chaque fois que vous faites à déboguer une erreur.)c.InteractiveShell.pdb = True
à sonipython_config.py
tour s'active%pdb
automatiquement à chaque session.Ce n'est pas le débogueur, mais probablement tout aussi utile (?)
Je sais que j'ai entendu Guido en parler quelque part dans un discours.
Je viens de vérifier python -?, Et si vous utilisez la commande -i, vous pouvez interagir là où votre script s'est arrêté.
Donc, étant donné ce script:
Vous pouvez obtenir cette sortie!
Pour être honnête, je ne l'ai pas utilisé, mais je devrais l'être, semble très utile.
la source
IPython rend cela simple sur la ligne de commande:
peut être réécrit en
Ou, de même, si vous appelez un module:
peut être réécrit en
Notez que
--
pour empêcher IPython de lire les arguments du script comme les siens.Cela présente également l'avantage d'invoquer le débogueur IPython amélioré (ipdb) au lieu de pdb.
la source
Si vous utilisez
ipython
, après le lancement du type%pdb
la source
Si vous utilisez l'environnement IPython, vous pouvez simplement utiliser le% debug et le shell vous ramènera à la ligne incriminée avec l'environnement ipdb pour les inspections, etc. Une autre option, comme indiqué ci-dessus, consiste à utiliser la magie iPython% pdb qui fait le même.
la source
up
et lesdown
commandes pour revenir à la ligne de votre code qui a généré l'erreur.Vous pouvez mettre cette ligne dans votre code:
Plus d'informations: démarrez le débogueur python à n'importe quelle ligne
la source
Pour l'exécuter sans avoir à taper c au début, utilisez:
Pdb a ses propres arguments de ligne de commande: -cc exécutera la commande c (ontinue) au début de l'exécution et le programme s'exécutera sans interruption jusqu'à l'erreur.
la source
python -m pdb script.py dans python2.7 appuyez sur continuer pour démarrer et il s'exécutera jusqu'à l'erreur et s'arrêtera là pour le débogage.
la source
Si vous exécutez un module:
Et maintenant, vous voulez entrer
pdb
lorsqu'une exception se produit, procédez comme suit:(ou étendez votre
PYTHONPATH
). LePYTHONPATH
est nécessaire pour que le module se trouve dans le chemin, puisque vous exécutez lepdb
module maintenant.la source
Mettez un point d'arrêt à l'intérieur du constructeur de la classe d'exception la plus élevée de la hiérarchie, et la plupart du temps, vous verrez où l'erreur a été déclenchée.
Mettre un point d'arrêt signifie ce que vous voulez qu'il signifie: vous pouvez utiliser un IDE, ou
pdb.set_trace
, ou autrela source