2009-08-06 6 views
6

De docs Python:Comment définir sys.excepthook pour appeler globalement pdb en python?

sys.excepthook(type, value, traceback)

Cette fonction imprime une retraçage donnée et exception à sys.stderr.

Lorsqu'une exception est déclenchée et non interceptée, l'interpréteur 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. Le traitement de ces exceptions de niveau supérieur peut être personnalisé en affectant 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 a-t-il un fichier de configuration que je peux changer? Je ne veux pas emballer mon code pour le faire.

Répondre

17

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 sur le 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 sophistiqué, et vérifie le mode interactif (curieusement sauter le débogage en mode interactif), de la cookbook:

# 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 
+0

Exactement ce que je voulais, merci. – saffsd

0

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

Je ne pense pas que nommer l'appelant pdb 'excepthook' soit sage. –

1

Une autre option consiste à utiliser ipython, que je considère comme un outil indispensable pour tout développeur python de toute façon. Au lieu d'exécuter votre script depuis le shell, exécutez-le depuis ipython avec% run. Lorsqu'une exception se produit, vous pouvez taper% debug pour le déboguer. (Il y a aussi une option pour déboguer automatiquement toute exception qui se produit, mais j'ai oublié de quoi il s'agit.)

Questions connexes