Comment puis-je mettre sys.excepthook d'invoquer pdb globalement en python?
-
11-09-2019 - |
Question
De docs Python:
sys.excepthook(type, value, traceback)
Cette fonction imprime un retraçage donné et exception à
sys.stderr
.Quand une exception est levée et non détectée, les appels d'un interprète
sys.excepthook
avec trois arguments, la classe d'exception, instance d'exception, et un objet de retraçage. Dans une session interactive cela se produit juste avant le contrôle est renvoyé à l'invite; dans un programme Python juste avant cela se produit le programme sort. La gestion de ces exceptions de haut niveau peut être personnalisé en attribuant une autre fonction à trois arguments àsys.excepthook
.
http://docs.python.org/library/sys.html
Comment puis-je modifier ce globalement si l'action par défaut est toujours invoquer pdb
? Y at-il un fichier de configuration que je peux changer? Je ne veux pas envelopper mon code pour le faire.
La solution
Voici ce que vous avez besoin
http://ynniv.com/blog/2007/11/debugging- python.html
Trois façons, la première est simple mais brut ( Thomas Heller ) - ajouter les éléments suivants au site-packages / sitecustomize.py:
import pdb, sys, traceback
def info(type, value, tb):
traceback.print_exception(type, value, tb)
pdb.pm()
sys.excepthook = info
Le deuxième est plus complexe, et vérifie le mode interactif (sauter étrangement le débogage en mode interactif), du livre de cuisine :
# code snippet, to be included in 'sitecustomize.py'
import sys
def info(type, value, tb):
if hasattr(sys, 'ps1') or not sys.stderr.isatty():
# we are in interactive mode or we don't have a tty-like
# device, so we call the default hook
sys.__excepthook__(type, value, tb)
else:
import traceback, pdb
# we are NOT in interactive mode, print the exception...
traceback.print_exception(type, value, tb)
print
# ...then start the debugger in post-mortem mode.
pdb.pm()
sys.excepthook = info
Et le troisième (qui commencent toujours le débogueur à moins stdin ou stderr sont redirigés) par ynniv
# code snippet, to be included in 'sitecustomize.py'
import sys
def info(type, value, tb):
if (#hasattr(sys, "ps1") or
not sys.stderr.isatty() or
not sys.stdin.isatty()):
# stdin or stderr is redirected, just do the normal thing
original_hook(type, value, tb)
else:
# a terminal is attached and stderr is not redirected, debug
import traceback, pdb
traceback.print_exception(type, value, tb)
print
pdb.pm()
#traceback.print_stack()
original_hook = sys.excepthook
if sys.excepthook == sys.__excepthook__:
# if someone already patched excepthook, let them win
sys.excepthook = info
Autres conseils
Une autre option consiste à utiliser ipython, que je considère comme un outil indispensable pour tout développeur de python de toute façon. Au lieu d'exécuter votre script à partir du shell, exécutez de ipython avec% run. Lorsqu'une exception se produit, vous pouvez taper% débogage pour déboguer. (Il y a aussi une option pour déboguer automatiquement une exception qui se produit, mais j'oublie ce qu'elle est.)
Essayez:
import pdb
import sys
def excepthook(type, value, traceback):
pdb.post_mortem(traceback)
excepthook.old = sys.excepthook
sys.excepthook = excepthook
def raise_exception():
raise_exception()
raise_exception()