在异常情况下总是调用python调试器的好方法

2024-04-25 22:26:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我曾写过一个python包装器脚本,但那一定很难看,而且几乎无法使用。在

我使用pudb,这是与pdb等效的API,因此特定于pdb的答案是可以的。我从我的编辑器(vim)中运行代码,并且希望在遇到异常时出现pm。在


Tags: 答案代码脚本api源代码vim编辑器post
2条回答

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

python -m pdb script.py

引用the documentation

When invoked as a script, pdb will automatically enter post-mortem debugging if the program being debugged exits abnormally. After post-mortem debugging (or after normal exit of the program), pdb will restart the program.

我花了几个月的时间对此束手无策,但我碰巧找到了一个解决办法。我相信这对经验丰富的人来说并不是什么新鲜事。在

我的环境中有以下情况:

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

我有以下文件:

^{pr2}$

包括以下内容:

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

现在,无论是交互还是其他方式,调试器总是在出现异常时跳转。把这个弄得漂亮点。在

确保您的site-packages中没有no-global-site-packages.txt,这一点很重要。这将使用默认的site.py禁用usercustomize模块(我的virtualenv有一个no-global-site-packages.txt

为了以防万一它能帮助其他人,我留下了关于修改__builtins__的内容。我发现总是能够依赖某些可用的工具是非常方便的。在

味道和味道。在

相关问题 更多 >