2014-01-18 82 views
0

我目前正在運行一個程序,我希望這個程序可以持續一兩個小時。我現在需要跳出循環,這樣程序的其餘部分纔會繼續。如何在執行時停止for循環

這是代碼的一部分:

from nltk.corpus import brown 
from nltk import word_tokenize, sent_tokenize 
from operator import itemgetter 

sentences = [] 
try: 
    for i in range(0,55000): 
     try: 
      sentences.append(brown.sents()[i]) 
      print i 
     except: 
      break 
except: 
    pass 

環路由目前的30,000。我想退出並繼續使用代碼(此處未顯示)。請建議我如何使程序不會完全退出。 (不喜歡鍵盤中斷)

+1

運行這個控制檯並在後臺模式? – thefourtheye

+0

它已經在控制檯中運行,無法停止程序。我可以改變模式嗎? – user3185551

+0

* nix版本:'nohup python script.py> output.txt&' – thefourtheye

回答

3

我想你也可以把for循環放在try塊中,並通過繼續執行程序的其餘部分來捕獲keyBoardInterrupt異常。採用這種方法,您應該能夠在程序內部按住ctrl + C的同時跳出循環。代碼看起來類似於:

try: 

    # your for loop 

except KeyboardInterrupt: 

    print "interrupted" 

# rest of your program 
2

您可以在break命令之前用pickle保存數據。下次加載數據並繼續循環。

4

由於它已經在運行,您不能修改代碼。除非您在pdb下調用它,否則不能闖入Python調試器來更改條件以離開循環並繼續執行程序的其餘部分。所以沒有任何正常的途徑向你開放。

有一個外部解決方案,它需要熟悉Python解釋器和運行時。您可以將gdb調試器附加到Python進程(如果您在Windows上則使用VisualStudio)。然後當你進入時,檢查主線程的堆棧跟蹤。您將看到一系列嵌套的PyEval_*調用等。如果您可以找出堆棧軌跡中的循環,請確定循環。然後,您需要找到計數器變量(一個包含在PyObject中的整數),並將其設置爲足夠大的值以觸發循環結束,然後讓該過程繼續。不是爲了心靈的懦弱!一些更多的信息是在這裏:

實際上,你只需要決定,如果你要麼離開它單獨完成,或殺死它,並重新啓動。

簡單地殺死進程,修改代碼以使循環可以中斷(如@fedorSmirnov建議的),並且使用KeyboardInterrupt異常,然後重新開始可能是最容易的。您將失去已投入的處理時間,但將其視爲沉沒成本。

這裏有上很多有用的信息如何支持添加到您的程序進行調試運行過程: