我希望post_mortem()在遇到异常时让我的调试器运行,而不必修改我正在处理的源.我看到很多例子涉及在try/except块中包装代码,但我想让它始终运行,无论我在做什么.
我研究了一个python包装器脚本,但是它变得丑陋且几乎无法使用.
我使用pudb,它与pdb的API等价,所以pdb特定的答案很好.我在我的编辑器(vim)中运行代码,并希望在遇到异常时让pm出现.
我开始使用 pudb 进行 Python 调试。它运行良好,我可以单步执行,它在我使用 pudb.set_trace() 放入代码的断点处停止。到现在为止还挺好。我遇到的主要问题是:
如果我点击 ^X 进入命令行窗格,我可以输入可执行行或变量名称,例如运行交互式 Python,但最轻微的错字(或尝试搜索其他命令,或请求 help())会让我失望在我无法恢复的状态。即使是 Control-c(如https://docs.python.org/2/tutorial/appendix.html#tut-interac所声称的)也只是显示为“^C”而什么也不做。
例如,如果我输入“help()”,它会打印一些 Python(而不是 pudb)帮助,以黄色重新显示“help()”,然后我就死在水里了。Backspace 不会影响显示的“help()”,并且 ^H 只是显示为脱字符 + H -- 直到我点击 return,当它似乎作为文字退格键附加到“help()”时,因为我可以使所有“帮助()”的一部分消失。我可以在“help()”之后输入任何内容,但我总是得到:
SyntaxError: unexpected EOF while parsing
Run Code Online (Sandbox Code Playgroud)
接着是重新显示我输入的内容。我如何“清除”这个状态并回到正常的命令行,而不是退出我的终端程序?
在 Mac OS X 10.9.5 上使用终端,不过我也可以尝试 Linux。
我正在尝试调试使用 tox 进行单元测试的 python 代码库。由于弄清楚,失败的测试之一被证明很困难,我想使用 pudb 来逐步执行代码。
一开始想到,会想到刚才pip install pudb在单元测试代码中加入import pudb和pudb.settrace()。但这会导致 ModuleNotFoundError:
> import pudb
>E ModuleNotFoundError: No module named 'pudb'
>tests/mytest.py:130: ModuleNotFoundError
> ERROR: InvocationError for command '/Users/me/myproject/.tox/py3/bin/pytest tests' (exited with code 1)
Run Code Online (Sandbox Code Playgroud)
注意到 .tox 项目文件夹会让人意识到在 tox 中有一个 site-packages 文件夹,这是有道理的,因为 tox 的重点是管理不同 virtualenv 场景下的测试。这也意味着有一个 tox.ini 配置文件,其 deps 部分可能如下所示:
[tox]
envlist = lint, py3
[testenv]
deps =
pytest
commands = pytest tests
Run Code Online (Sandbox Code Playgroud)
添加pudb到 deps 列表应该可以解决 ModuleNotFoundError,但会导致另一个错误:
self = <_pytest.capture.DontReadFromInput object at 0x103bd2b00> …Run Code Online (Sandbox Code Playgroud)