Python中最好的交互式调试方法是什么?

8
我想利用Python的内省能力进行调试/开发,但找不到合适的工具。
我需要在特定位置或特定事件(比如异常)进入shell(例如IPython),并将shell的局部变量和全局变量设置为帧的变量。
这是我自己快速的hack示例:
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)

使用“断点”或try/except从run_debug()调用。但是,显然,这需要很多改进,特别是要正确处理线程应用程序。
winpdb具有控制台断点,但我没有找到快速从中运行适当的Python shell的方法,并且eval()/exec()对于长时间调试不太方便。
3个回答

3
类似于您已经在做的事情,有一个名为ipdb的工具。 它实际上就是使用ipython的shell(即tab补全,各种不同的魔术函数等)的pdb。

它实际上正在执行您在问题中发布的代码片段,但将其包装成一个简单的“ipdb.set_trace()”调用。


1
是的,这几乎就是我需要的,但它与线程不兼容,就像我的示例一样。当我从其中一个子线程调用它时,其他线程仍在运行,改变数据,向已停止的线程发送消息,并继续向控制台输出数据。 - Daniel Kluev

2

对于个人/教育目的,您可以使用WingIDE - 它们具有相当可靠的调试功能。

当然,如果您只是担心更改值,您始终可以使用raw_input() - 但这可能不足以满足您的需求。


谢谢,他们的专业版确实具有所需功能,并且在运行shell之前停止进程执行,因此线程不成问题。很遗憾它是私有的,但似乎这就是你所付出的代价。 - Daniel Kluev
我猜这就是收费的好处之一——他们可以负担得起雇佣人员并支付他们解决这样的问题 ;) 当然,如果价格太高,你可以随时寻找当地的 Python 大会,并建议他们向 Wing 索要一些赠品副本。 他们每年都给我们提供3-4个,而我听说的其他交易也都令人印象深刻。 - Wayne Werner

0

如果您在 IPython 中运行代码,并出现异常,您可以在之后调用 %debug 进入 pdb 调试。 这应该能够提供您所需要的信息。 或者,如果您运行 ipython -pdb,在未捕获的异常发生时将自动进入 pdb。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接