Cap*_*day 4 python vim exception-handling pdb pudb
我希望post_mortem()在遇到异常时让我的调试器运行,而不必修改我正在处理的源.我看到很多例子涉及在try/except块中包装代码,但我想让它始终运行,无论我在做什么.
我研究了一个python包装器脚本,但是它变得丑陋且几乎无法使用.
我使用pudb,它与pdb的API等价,所以pdb特定的答案很好.我在我的编辑器(vim)中运行代码,并希望在遇到异常时让pm出现.
花了几个月的时间没有采取任何措施,但我偶然发现了一个解决方案.我相信对于经验更丰富的人来说,这并不是什么新鲜事.
我的环境中有以下内容:
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__.我觉得总是能够依赖某些可用的工具非常方便.
口味.
一个可能的解决方案是作为脚本调用pdb(我不知道pudb,但我只是假设它的工作原理相同):
python -m pdb script.py
Run Code Online (Sandbox Code Playgroud)
引用文档:
当作为脚本调用时,如果被调试的程序异常退出,pdb将自动进入事后调试。事后调试后(或程序正常退出后),pdb将重新启动程序。