2013-09-25 345 views
13

我目前有代碼,基本上運行無限while循環來收集用戶的數據。不斷更新基於文本文件內容的字典/列表。供參考:結束無限while循環

while (True): 
    IDs2=UpdatePoints(value,IDs2) 
    time.sleep(10) 

基本上,我的問題是,我不知道什麼時候我想這是結束,但是這個while循環後運行我想用收集到的信息,而不是崩潰我的程序失去它。有沒有簡單,優雅的方式,只要我想要退出while循環?像按下我的鍵盤上的某個鍵會很棒。

回答

38

你可以試試/包裝的代碼在try塊除外,因爲鍵盤中斷只是例外:

try: 
    while True: 
     IDs2=UpdatePoints(value,IDs2) 
     time.sleep(10) 
except KeyboardInterrupt: 
    print('interrupted!') 

然後,你可以退出與CTRL-C循環。

+0

夥計們,你們真棒。這工作。 – Blessoul

+0

我不得不說,這是我見過的一個嘗試/除了塊以外的更好用途之一。我可能會嘗試這種模式進行調試。 – reem

+0

這不適用於Python 3.5 – dopatraman

4

我認爲最簡單的解決方案是在的時候趕上KeyboardInterrupt,並用它來確定何時停止循環。

except KeyboardInterrupt: 
    break 

查找此異常的缺點是,它可能會阻止用戶在循環仍在運行時終止程序。

+0

CTRL + BREAK是超級中斷鍵,至少在Windows上。 –

6

您可以使用例外。但你只應該使用例外情況來處理那些不應該發生的事情。所以不是爲了這個。

這就是爲什麼我推薦信號:

import sys, signal 
def signal_handler(signal, frame): 
    print("\nprogram exiting gracefully") 
    sys.exit(0) 

signal.signal(signal.SIGINT, signal_handler) 

,你應該把這個程序的開始,當你按下Ctrl + C無論在你的程序將正常關閉

代碼解釋:

您進口syssignals。 然後你製作一個在退出時執行的函數。 sys.exit(0)停止編程退出碼0(代碼說,一切都很好)。

當程序通過ctrl-c或終端中的kill命令獲取SIGINT時,程序將優雅地關閉。