在Python中进行交互调试的最佳方法是什么?

8 投票
3 回答
2268 浏览
提问于 2025-04-16 01:41

我想利用Python的自省功能来进行调试和开发,但找不到合适的工具。

我需要在特定的位置或者特定的事件(比如出现异常时)进入一个命令行界面(比如IPython),并且这个命令行的局部变量和全局变量要和当前的上下文一致。

我自己快速写了个小工具来演示这个想法:

import inspect
from IPython.Shell import IPShellEmbed
def run_debug():
    stack = inspect.stack()
    frame = stack[1][0]
    loc = frame.f_locals
    glob = frame.f_globals
    shell = IPShellEmbed()
    shell(local_ns=loc, global_ns=glob)

通过在'breakpoint'或者try/except中调用run_debug()来实现。不过,这显然还需要很多改进,特别是要让它在多线程应用中正常工作。

winpdb有带控制台的断点,但我没找到快速从中运行合适的Python命令行的方法,而且eval()/exec()在长时间调试时也不太方便。

3 个回答

0

如果你在ipython中运行代码时遇到错误,你可以在出错后输入 %debug,这样就会进入一个叫做pdb的调试模式,这样你就能查看出错的地方了。或者,你也可以直接用命令 ipython -pdb 启动ipython,这样一旦出现未处理的错误,你就会自动进入pdb调试模式。

3

和你现在做的差不多,还有一个叫做 ipdb 的东西。简单来说,它就是在 pdb 的基础上加上了 ipython 的命令行功能(比如可以按 Tab 键补全、各种神奇的功能等等)。

其实它的功能和你在问题中发的小代码片段是一样的,只不过把这些功能封装成了一个简单的 "ipdb.set_trace()" 调用。

2

如果是个人学习或者教育用途,你可以使用WingIDE这个工具,它有很强大的调试功能。

当然,如果你只是想修改一些值,使用raw_input()也可以,但这可能对你来说不够高级。

撰写回答