在Python中进行交互调试的最佳方法是什么?
我想利用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()
也可以,但这可能对你来说不够高级。