2013-05-06 1 views
3

Я хочу, чтобы мой отладчик запускал post_mortem() всякий раз, когда встречается исключение, без, чтобы изменить источник, над которым я работаю. Я вижу множество примеров, которые включают в себя код упаковки в блоке try/except, но я бы хотел, чтобы он всегда запускался независимо от того, над чем я работаю.Приятный общий способ всегда вызывать отладчик python после исключения

Я работал над сценарием оболочки python, но это должно было быть уродливым и в значительной степени непригодным для использования.

Я использую pudb, что эквивалентно API для pdb, поэтому ответ pdb-специфический. Я запускаю код из моего редактора (vim) и хотел бы, чтобы pm приходил в любое время, когда встречается исключение.

ответ

1

Возможное решение вызвать pdb (я не знаю, о pudb, но я просто предполагаю, что это работает так же) как сценарий:

python -m pdb script.py 

Цитируя the documentation:

При вызове в качестве скрипта pdb автоматически вводит post-mortem , если отлаживаемая программа выходит аномально. После посмертная отладка (или после нормального выхода программы), pdb будет перезапустить программу.

+0

Да. Это то, что говорят документы, но если я запустил это, даже по титивному сценарию, я всегда вхожу в отладчик: $ echo ''> /tmp/x.py && python -m pdb /tmp/x.py > /tmp/x.py(1) () -> (Pdb) –

+0

Вы правы, программа не запускается немедленно. Вы можете добавить файл '.pdbrc', содержащий' continue' в вашем домашнем каталоге или каталоге проекта, но, к сожалению, это [поддерживается только с 3,2] (http://docs.python.org/dev/library/pdb.html # module-pdb) – icecrime

+0

Похоже, это одно существенное отличие от пудба. Нет «.pudbrc». –

4

Потребовалось несколько месяцев, чтобы ничего не делать, но я случайно наткнулся на решение. Я уверен, что это ничего нового для более опытных.

У меня есть следующие в моей среде:

export PYTHONUSERBASE=~/.python 
export PYTHONPATH=$PYTHONPATH:$PYTHONUSERBASE 

И у меня есть следующий файл:

~/.python/lib/python2.7/site-packages/usercustomize.py 

со следующим содержанием:

import traceback 
import sys 

try: 
    import pudb as debugger 
except ImportError: 
    import pdb as debugger 

def drop_debugger(type, value, tb): 
    traceback.print_exception(type, value, tb) 
    debugger.pm() 

sys.excepthook = drop_debugger 

__builtins__['debugger'] = debugger 
__builtins__['st'] = debugger.set_trace 

Теперь, будь то в интерактивном режиме или в противном случае отладчик всегда переходит к исключению. Возможно, было бы неплохо придумать это.

Важно, чтобы у вас не было no-global-site-packages.txt в вашем site-packages. Это отключит usercustomize модуль с по умолчанию site.py (мой virtualenv был no-global-site-packages.txt)

Только в случае, если она будет помогать другим, я оставил в бите об изменении __builtins__. Мне очень удобно всегда быть в состоянии полагаться на некоторые доступные инструменты.

Вкус по вкусу.

+0

OH. MY. БОГ. Да. <3 <3 <3 –