很好的通用方法,在出现异常时总是调用python调试器。

问题描述 投票:5回答:3

我想让我的调试器运行以下内容 post_mortem() 遇到异常时。 不得不修改我正在处理的源代码。我看到很多例子都涉及到用 tryexcept 块来包装代码,但我想让它始终运行,不管我在做什么。

我曾做过一个python的包装脚本,但它变得很丑陋,而且几乎无法使用。

我使用了 泥巴这相当于pdb的API,所以pdb专用的答案也可以。我在我的编辑器(vim)中运行代码,希望在遇到异常时,pm能随时出现。

python vim exception-handling pdb pudb
3个回答
6
投票

花了几个月的时间没有做任何事情,但我偶然发现了一个解决方案。我相信对于比较有经验的人来说,这已经不是什么新鲜事了。

我的环境里有以下内容。

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__. 我发现它相当方便,总是能够依靠一些特定的工具是可用的。

味道要尝尝。


1
投票

一个可能的解决方案是调用 pdb (我不知道 pudb,但我就认为它的工作原理是一样的)作为一个脚本。

python -m pdb script.py

引用 文件:

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


0
投票

解决方法 pdb 自Python 3.2以来 是在调试器下通过 -m pdb 并告诉pdb继续通过 -c c:

python3 -m pdb -c c program.py

引述 pdb文件:

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

截至pudb 2019.2:根据 pudb文件官方的方法是修改一下你的代码(即使如此,我也不会在死后模式下,如果我只运行了 python3 program.py!):

要启动调试器而不实际暂停,请使用:

from pudb import set_trace; set_trace(paused=False)

在代码的顶部。这将在不中断的情况下启动调试器,并运行到预定义的断点。你也可以在调试器内部的set_trace调用中按b,这将防止它在那里停止。

虽然在调试器下可以通过以下方式正确启动程序 python3 -m pudb.run program.py,pudb的命令行args不支持任何像pdb的 -c c. pudb的 --pre-run=COMMAND 是用于外部命令,而不是pudb命令。

我现在做的是运行 python3 -m pudb.run program.py 不提 pudbset_traceprogram.py 并按 c 键盘上。这样pudb就会在任何未处理的异常时进入死后模式。然而,只有当我知道这个异常会被重现时,这种方式才会有效。对于偶尔出现的异常,我又回到了pdb的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.