2009-10-21 25 views
1

道歉重新發布,但我不得不編輯這個問題,當我開始工作,並意識到我需要有一個帳戶來這樣做。所以這裏再次提到(多一點情況)。Python中的setTrace()(REDX)

我想時間多久腳本需要執行,我想通過檢查每行代碼執行後經過的時間來做到這一點。我之前在腳本包含方法定義時已經完成了這個工作,但我不確定在這個實例中它是如何工作的。

所以我的問題是:有一種方法可以在沒有方法定義的腳本中使用setTrace()函數嗎?即

for i in range(1, 100): 
    print i 

def traceit(frame, event, arg): 
    if event == "line": 
     lineno = frame.f_lineno 
     print "line", lineno 

    return traceit 

sys.settrace(traceit) 

回答

2

不,the docs說,「跟蹤功能調用(與事件設置爲‘呼叫’),每當一個新的局部範圍中輸入」 - 如果你從來沒有進入本地範圍(只有執行在全局範圍內),trace函數將永遠不會被調用。請注意,settrace無論如何都是非常有創意的,以便計算「腳本執行多長時間」的時間,因爲它會改變它測量的內容太多;如果你所說的實際上是你想要的,只需花時間在開始執行,並註冊atexit一個函數,再次獲取時間並打印差異。如果你想要的是不同的,即分析,參見cProfile

此外請注意,你給出的代碼示例不可能做任何有用的事情(即使我已經編輯它來修復縮進錯誤):首先它循環,然後它定義一個函數,最後它調用settrace ..然後立即結束,因爲之後沒有更多的代碼!如果你想要發生任何事情之前循環開始,並且你想要在模塊頂級水平有一切(壞主意,但是,無論如何),你必須在循環之前,而不是之後在詞彙上放置「任何東西」。 .. ;-)

+0

謝謝,這正是我一直在尋找!我不確定'atexit'是不是我想要的。我期望不斷檢查時間,如果超過了某個限制,那麼腳本將終止。主要用於檢查無限循環。你會用什麼來做到這一點? – Leonidas 2009-10-21 15:43:38

+0

在Linux或任何其他Unix-y操作系統(==大部分窗口)中,signal.alarm,請參閱http://docs.python.org/library/signal.html?highlight=alarm#signal.alarm - after signal.alarm(3600)例如,您將在一小時後獲得SIGALRM,您可以處理它或讓它殺死您的進程。在Windows中,我想我會用一個「睡眠線程」來克隆它,如果它在超時後喚醒它,就會終止進程。在某些情況下,產生一個獨立的看門狗進程會更加穩固(如果你的進程被嵌入了Python控制之外的無法等待的不可中斷等待)。 – 2009-10-21 17:23:51