2017-03-15 82 views
0

我有一個基於PyQt4的python 2.7應用程序。我需要在特定處理程序中處理Ctrl + C(KeyboardInterruptSIGINT,2)。我發現通過按Ctrl + C創建的異常未在try-except塊中捕獲,並且在處理函數中沒有看到,由signal庫註冊。 Ctrl + C什麼都不做!
我試圖做同樣沒有PyQt - signal工程很好。
用於測試的代碼不使用任何PyQt API,因此我可以在兩種情況下使用它進行檢查。如何在python應用程序中使用PyQt處理Ctrl + C?

回答

1

CTRL + C導致信號被髮送到過程。 Python捕獲信號,並設置一個全局變量,如CTRL_C_PRESSED = True。然後,每當Python解釋器執行一個新的操作碼時,它就會看到變量集並引發一個KeybordInterrupt。

這意味着CTRL + C只有在Python解釋器正在旋轉時才起作用。如果解釋器正在執行用C語言編寫的擴展模塊來執行長時間運行的操作,CTRL + C將不會中斷它,除非它明確地與Python「協作」。例如:time.sleep()在理論上是一個阻塞操作,但該函數的實現與Python解釋器「協作」使CTRL + C工作。

這是全部設計:CTRL + C是爲了做一個「乾淨的中止」;這就是爲什麼它被Python變成一個異常(所以清理在堆棧展開期間執行),並且擴展模塊的支持有點「選入」。如果你想完全中止這個過程,而沒有給它一個清理的機會,你可以使用CTRL +。

當Python調用QApplication :: exec()(C++函數)時,Qt並不知道如何與Python進行「配合」來控制CTRL + C,這就是爲什麼它不起作用。我不認爲有一個好的方法來「讓它工作」;你可能想看看你是否可以通過全局事件過濾器來處理它。 - Giovanni Bajo

將此添加到主程序解決了問題。

import signal 

signal.signal(signal.SIGINT, signal.SIG_DFL) 

我不確定這與解釋有什麼關係。

+0

好吧,它可以讓我殺掉我的程序而無需處理。有可能處理Ctrl + C? – Jury

+0

'進口signal' '進口sys' 'DEF signal_term_handler(信號,幀):'' 打印「得到SIGTERM'' 'sys.exit(0)' 'signal.signal(signal.SIGTERM, signal_term_handler)' –

相關問題