Как установить sys.excepthook для вызова pdb глобально в python?
из документов Python:
sys.excepthook(type, value, traceback)
эта функция выводит заданную трассировку и исключение для
sys.stderr
.когда исключение возникает и не перехвачено, интерпретатор вызывает
sys.excepthook
С тремя аргументами: класс исключения, экземпляр исключения и объект обратной трассировки. В интерактивном сеансе это происходит непосредственно перед возвращением элемента управления в приглашение; в программе Python это происходит непосредственно перед выходом программы. Этот обработка таких исключений верхнего уровня может быть настроена путем назначения другой функции трех аргументовsys.excepthook
.
http://docs.python.org/library/sys.html
как изменить это глобально, чтобы действие по умолчанию всегда вызывало pdb
? Есть ли файл конфигурации, который я могу изменить? Я не хочу сворачивать свой код, чтобы сделать это.
3 ответов
вот что вам понадобится
http://ynniv.com/blog/2007/11/debugging-python.html
три способа, первый простой, но сырой (Томас Хеллер) - добавить в site-packages/sitecustomize.py:
import pdb, sys, traceback
def info(type, value, tb):
traceback.print_exception(type, value, tb)
pdb.pm()
sys.excepthook = info
второй более сложный и проверяет интерактивный режим (странно пропуская отладку в интерактивном режиме), из рецепты:
# 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
и третий (который всегда запускайте отладчик, если stdin или stderr не перенаправлены) по 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
другой вариант-использовать ipython,который я считаю обязательным инструментом для любого разработчика python. Вместо запуска скрипта из оболочки запустите его из ipython с помощью %run. При возникновении исключения для его отладки можно ввести %debug. (Существует также возможность автоматической отладки любого исключения, которое происходит, но я забываю, что это такое.)
попробуй:
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()