python中交互式调试的最佳方式是什么?
我想利用python的自省功能进行调试/开发,但找不到合适的工具。python中交互式调试的最佳方式是什么?
我需要在特定位置或特定事件(如异常)进入shell(例如IPython),并将shell的局部和全局变量设置为帧的。
我自己的快速黑客来说明吧:
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)
在根据run_debug()从 '断点' 呼叫或尝试/除外。但是,显然,这需要大量的改进,尤其是适当地使用线程应用程序。
winpdb与控制台有断点,但我发现没有办法从它快速运行适当的python shell,并且eval()/ exec()对于长时间调试不太方便。
如果你从ipython运行你的代码并且遇到异常,你可以调用%debug在异常时调用pdb。这应该给你你想要的。或者,如果您运行ipython -pdb,则会在未捕获的异常发生时自动将其放入pdb中。
与您现在正在做的相似,有ipdb。实际上,它是ipython的shell(即制表符完成,所有各种魔术函数等)的pdb。
它实际上只是在您的问题中发布的小代码所剪切的内容,但将其封装到一个简单的“ipdb.set_trace()”调用中。
是的,这就是我所需要的,但它不能很好地与线程一起玩,就像我自己的例子。当我从其中一个子线程调用它时,其他线程仍在运行,更改数据,将消息发送到暂停的线程,并将数据输出到控制台。 – 2010-07-23 01:55:18
谢谢,他们的Pro版本确实需要功能,它在运行shell之前暂停执行进程,所以线程并不是问题。 很遗憾它的专有,但似乎它是你得到什么付费的情况。 – 2010-07-23 02:11:58
我想这是收费的好处之一 - 他们可以承担雇用人并支付他们的费用,以解决类似问题;)当然,如果价格过高,您可以随时环顾当地的python会议,并建议他们询问翼为一些赠送的副本。他们每年向我们提供3-4次我们所要求的信息,而我与他们交流过的每一次交易都令人印象深刻。 – 2010-07-23 12:26:57