2012-03-20 140 views
7

我有我的主應用程序線程產生2個線程,我在主線程中捕獲SIGINT以很好地退出它們。 在linux上,我使用的是signal.pause(),它的工作原理非常完美。Python:在Windows上相當於signal.pause()

什麼是在Windows上實現signal.pause()的最佳方式?

我的醜的解決方案是:

my_queue.get(True, averylongtime) 

,放在my_queue東西在我的信號處理程序。請注意,如果我不指定超時,則不會捕獲到SIGINT。但我想知道是否有更好的解決方案。

謝謝

+0

您是如何生成SIGINT的?如果它只是鍵盤上的 + C,那麼你可以捕獲KeyboardInterrupt。否則,它可能是引發Win32事件的一種情況。 – cdarke 2012-03-20 13:07:32

回答

0

我用這個:

#another: 
while not self.quit: 
    # your code 

# main 
try: 
    # your code 
except KeyboardInterrupt: 
    another.quit = True 
    time.sleep(5) # or wait for threading.enumerate() or similar 

如果我想它更強大的,比方說,出口在錯誤面前過於:

except KeyboardInterrupt: 
    another.quit = True 
    signal.alarm(5) 
    time.sleep(6) 

一個副作用,這是每個塊你except:except Exception, e:(這是不是你應該做的任何/你應該做的事情),你必須預先except KeyboardInterrupt: raise,以便該異常不被「吃掉」。

+0

你的答案的一部分將無法在Windows上工作,這是什麼問題。 signal.alarm在Windows上不可用 – 2013-02-23 20:09:41

+0

good catch @PhilippeOmbredanne – 2013-02-24 08:23:22

+0

和FWIW @qarma ...我會對像signal.alarm但在窗口中工作的東西感興趣 – 2013-02-25 23:47:15

0

我用它來捕獲windows上的ctrl-c。如果我正在寫一個管道或文件或者你有什麼......我想要優雅地退出。以下是一個玩具示例

import signal 
import sys 

def signal_handler(signal, frame):  
    print('Process Interrupted!\n\a') 
    sys.exit(0) 

signal.signal(signal.SIGINT,signal_handler) 

#Rest of your code