7
votes

Comment définir Sys.excepthook pour invoquer PDB globalement à Python?

de Python Docs:

sys.excepthook (type, valeur, trace)

Cette fonction imprime une traçabilité donnée et une exception à sys.ssderr .

Lorsqu'une exception est levée et non capturée, l'interprète appelle sys.excepthook avec trois arguments, la classe d'exception, l'instance d'exception et un objet de trace. Dans une session interactive, cela se produit juste avant que le contrôle ne soit renvoyé à l'invite; Dans un programme Python, cela se produit juste avant la sortie du programme. La manipulation de telles exceptions de niveau supérieur peut être personnalisée en attribuant une autre fonction de trois arguments à sys.excepthook .

http://docs.python.org/library/sys.html

Comment puis-je modifier cela dans le monde entier afin que l'action par défaut soit pour toujours invoquer pdb ? Y a-t-il un fichier de configuration que je peux changer? Je ne veux pas envelopper mon code pour faire cela.


0 commentaires

3 Réponses :


21
votes

Voici ce dont vous avez besoin

http://ynniv.com/blog /2007/11/debugging-pytHon.html P>

Trois façons, le premier est simple mais brut ( Thomas Heller ) - Ajoutez les suivantes aux packages de site / SITECUSTOMIZE.PY: P>

# 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


0 commentaires

0
votes

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()


1 commentaires

Je ne pense pas que la nommée L'appelant PDB 'Excepthook' est sage.



1
votes

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 de la coquille, passez-le d'Ipython avec% exécuté. Lorsqu'une exception se produit, vous pouvez taper% de débogage pour le déboguer. (Il y a aussi une option pour déboguer automatiquement toute exception qui se produit, mais j'oublie ce que c'est.)


0 commentaires