总是在异常时总是调用python调试器的一般方法

Cap*_*day 4 python vim exception-handling pdb pudb

我希望post_mortem()在遇到异常时让我的调试器运行,不必修改我正在处理的源.我看到很多例子涉及在try/except块中包装代码,但我想让它始终运行,无论我在做什么.

我研究了一个python包装器脚本,但是它变得丑陋且几乎无法使用.

我使用pudb,它与pdb的API等价,所以pdb特定的答案很好.我在我的编辑器(vim)中运行代码,并希望在遇到异常时让pm出现.

Cap*_*day 6

花了几个月的时间没有采取任何措施,但我偶然发现了一个解决方案.我相信对于经验更丰富的人来说,这并不是什么新鲜事.

我的环境中有以下内容:

export PYTHONUSERBASE=~/.python
export PYTHONPATH=$PYTHONPATH:$PYTHONUSERBASE
Run Code Online (Sandbox Code Playgroud)

我有以下文件:

~/.python/lib/python2.7/site-packages/usercustomize.py
Run Code Online (Sandbox Code Playgroud)

具有以下内容:

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
Run Code Online (Sandbox Code Playgroud)

现在,无论是交互式还是其他方式,调试器总是会跳转到异常.一些人可能会很聪明.

确保你没有是很重要的no-global-site-packages.txt在你的site-packages.这将禁用usercustomize默认模块site.py(我的virtualenv有一个no-global-site-packages.txt)

为了防止其他人,我还有一点关于修改的内容__builtins__.我觉得总是能够依赖某些可用的工具非常方便.

口味.


ice*_*ime 1

一个可能的解决方案是作为脚本调用pdb(我不知道pudb,但我只是假设它的工作原理相同):

python -m pdb script.py
Run Code Online (Sandbox Code Playgroud)

引用文档

当作为脚本调用时,如果被调试的程序异常退出,pdb将自动进入事后调试。事后调试后(或程序正常退出后),pdb将重新启动程序。