2010-07-22 135 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

相關問題