2010-07-22 130 views
8

我想利用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()对于长时间调试不太方便。

回答

2

对于个人/教育目的,您可以使用WingIDE - 它们具有非常稳定的调试功能。

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

+0

谢谢,他们的Pro版本确实需要功能,它在运行shell之前暂停执行进程,所以线程并不是问题。 很遗憾它的专有,但似乎它是你得到什么付费的情况。 – 2010-07-23 02:11:58

+0

我想这是收费的好处之一 - 他们可以承担雇用人并支付他们的费用,以解决类似问题;)当然,如果价格过高,您可以随时环顾当地的python会议,并建议他们询问翼为一些赠送的副本。他们每年向我们提供3-4次我们所要求的信息,而我与他们交流过的每一次交易都令人印象深刻。 – 2010-07-23 12:26:57

0

PyScripter(FOSS)有着相当不错的调试器构建了什么。

0

如果你从ipython运行你的代码并且遇到异常,你可以调用%debug在异常时调用pdb。这应该给你你想要的。或者,如果您运行ipython -pdb,则会在未捕获的异常发生时自动将其放入pdb中。

3

与您现在正在做的相似,有ipdb。实际上,它是ipython的shell(即制表符完成,所有各种魔术函数等)的pdb。

它实际上只是在您的问题中发布的小代码所剪切的内容,但将其封装到一个简单的“ipdb.set_trace()”调用中。

+1

是的,这就是我所需要的,但它不能很好地与线程一起玩,就像我自己的例子。当我从其中一个子线程调用它时,其他线程仍在运行,更改数据,将消息发送到暂停的线程,并将数据输出到控制台。 – 2010-07-23 01:55:18

相关问题