Как мне установить sys.excepthook для глобального вызова pdb в python? - PullRequest
6 голосов
/ 06 августа 2009

Из документов Python:

sys.excepthook(type, value, traceback)

Эта функция выводит заданную трассировку и исключение на sys.stderr.

Когда исключение возникает и не обрабатывается, интерпретатор вызывает sys.excepthook с тремя аргументами, классом исключения, экземпляром исключения и объектом трассировки. В интерактивном сеансе это происходит непосредственно перед тем, как управление возвращается к приглашению; в программе Python это происходит непосредственно перед выходом из программы. Обработка таких исключений верхнего уровня может быть настроена путем назначения другой функции с тремя аргументами sys.excepthook.

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

Как мне изменить это глобально, чтобы действие по умолчанию всегда вызывало pdb? Есть ли файл конфигурации, который я могу изменить? Я не хочу оборачивать свой код, чтобы сделать это.

Ответы [ 3 ]

17 голосов
/ 06 августа 2009

Вот что вам нужно

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
1 голос
/ 26 августа 2009

Другой вариант - использовать ipython, который я считаю обязательным инструментом для любого разработчика python. Вместо запуска вашего скрипта из оболочки, запустите его из ipython с помощью% run. Когда возникает исключение, вы можете набрать% debug для его отладки. (Существует также возможность автоматической отладки любого возникающего исключения, но я забываю, что это.)

0 голосов
/ 06 августа 2009

Попробуйте:

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