Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中交互式调试的最佳方式是什么?_Python_Debugging_Pdb - Fatal编程技术网

python中交互式调试的最佳方式是什么?

python中交互式调试的最佳方式是什么?,python,debugging,pdb,Python,Debugging,Pdb,我想利用python的内省功能进行调试/开发,但找不到合适的工具 我需要在特定位置或特定事件(如exception)进入shell(例如IPython),shell的局部值和全局值都设置为帧的值 我自己的快速破解来说明这一点: import inspect from IPython.Shell import IPShellEmbed def run_debug(): stack = inspect.stack() frame = stack[1][0] loc = fra

我想利用python的内省功能进行调试/开发,但找不到合适的工具

我需要在特定位置或特定事件(如exception)进入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)
通过从“断点”或try/except执行相应的run_debug()调用。但是,很明显,这需要很多改进,尤其是要正确使用线程应用程序


winpdb在控制台上有断点,但我发现没有办法从控制台上快速运行适当的python shell,而且eval()/exec()对于长时间调试不是很方便。

出于个人/教育目的,您可以使用它们-它们有一些非常可靠的调试功能


当然,如果您只是担心更改值,您可以始终使用
raw\u input()
——但这可能不够高级,无法满足您的需要。

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

与您正在执行的操作类似,有两个错误。实际上,它是带有ipython外壳的pdb(即选项卡完成、所有各种神奇功能等)


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

是的,这几乎是我所需要的,但它不能很好地处理线程,就像我自己的示例一样。当我从一个子线程调用它时,另一个子线程仍在运行,更改数据,向暂停的线程发送消息,并不断向控制台输出数据。感谢,他们的Pro版本确实具有所需的功能,它在运行Shell之前停止进程执行,所以线程不是问题。很遗憾,它是专有的,但它似乎是你花钱买的东西。我想这是收费的好处之一——他们可以雇得起人,付钱给他们解决这样的问题;)当然,如果价格太高,你可以四处看看当地的python会议,建议他们向Wing索取一些免费的副本。按照我们的要求,他们每年给我们3-4分,我听到的每一次与他们的交易都给人留下深刻印象。