2009-08-06 4 views
6

Von Python-Dokumentation:Wie setze ich sys.excepthook, um pdb global in Python aufzurufen?

sys.excepthook(type, value, traceback)

Diese Funktion druckt eine bestimmte Traceback und Ausnahme sys.stderr aus.

Wenn eine Ausnahme ausgelöst und nicht abgefangen wird, ruft der Interpreter sys.excepthook mit drei Argumenten auf, der Ausnahmeklasse, der Ausnahmeinstanz und einem Traceback-Objekt. In einer interaktiven Sitzung geschieht dies unmittelbar bevor die Steuerung an die Eingabeaufforderung zurückgegeben wird. In einem Python-Programm geschieht dies kurz bevor das Programm beendet wird. Die Behandlung solcher Ausnahmen auf oberster Ebene kann angepasst werden, indem sys.excepthook eine weitere Funktion mit drei Argumenten zugewiesen wird.

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

Wie modifiziere ich das global so die Standard-Aktion ist es, immer pdb aufrufen? Gibt es eine Konfigurationsdatei, die ich ändern kann? Ich möchte meinen Code dafür nicht einpacken.

Antwort

17

Hier ist, was Sie

http://ynniv.com/blog/2007/11/debugging-python.html

Drei Wege benötigen, ist die erste einfache, aber rohes (Thomas Heller) - die folgenden Website-Pakete/sitecustomize.py hinzufügen:

import pdb, sys, traceback 
def info(type, value, tb): 
    traceback.print_exception(type, value, tb) 
    pdb.pm() 
sys.excepthook = info 

Die Sekunde ist ausgeklügelter und prüft auf interaktiven Modus (sonderbar das Debugging im interaktiven Modus überspringend), von der 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 

Und die dritte (die immer den Debugger starten, wenn stdin oder stderr umgeleitet werden) durch 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

Genau das, was ich wollte, danke. – saffsd

0

Versuchen:

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

Ich glaube nicht, dass die Benennung des pdb-Aufrufers 'excepthook' weise ist. –

1

Eine weitere Option zu verwenden ipython ist, die ich für ein Must-Have-Tool für jeden Python-Entwickler sowieso. Führen Sie das Skript nicht über die Shell aus, sondern führen Sie es über ipython mit% run aus. Wenn eine Ausnahme auftritt, können Sie% debug eingeben, um sie zu debuggen. (Es gibt auch eine Option, jede auftretende Ausnahme automatisch zu debuggen, aber ich vergesse, was es ist.)