2011-03-01 97 views
10

爲什麼不能使用Ctrl + C如何破解一個使用PyQt的Python程序?我想調試它並獲得堆棧跟蹤,由於某種原因,這比使用C++更難!Ctrl-C無法與PyQt配合使用

+0

你正在使用哪個操作系統? – 2011-03-01 21:35:19

+4

你應該使用谷歌;-) [你的問題解決方案解釋](http://www.mail-archive.com/[email protected]/msg13757.html) – user225312 2011-03-01 21:36:22

+0

@A A-尼斯!我認爲這是一個Ctrl + C與Ctrl + D的情況。 – 2011-03-01 21:37:41

回答

19

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

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

這是全部設計:CTRL + C意味着 做一個「乾淨的中止」;這就是爲什麼它 變成 Python的異常(以便在堆棧展開期間執行清理操作的 )以及 支持的擴展模塊的排序爲012-「opt-in」。如果您想完全中止該過程,但不給它一個清理的 機會,則可以使用CTRL +。

當Python調用的QApplication :: EXEC() (C++函數),Qt不知道 如何 「合作」 與Python的 CTRL + C,這就是爲什麼它不 工作。我認爲 沒有一個好辦法「讓它工作」;如果您可以通過全局 事件過濾器處理它,您可能希望看到 。 - Giovanni Bajo

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

import signal 

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

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

+1

我不知道這是幹什麼的,但它確實可以工作!編輯:讀一下它[這裏](https://docs.python.org/3/library/signal.html)所以它說,SIGINT(= Ctrl + C)應該執行默認操作(=退出) 。 – z3ntu 2016-07-23 11:42:36

2

我同意尼爾·G,並想補充一點:

如果你不電話 QApplication.exec_()啓動事件循環,而是在一個交互式的Python Shell執行程序(使用python -i),pyqt會在交互提示符等待時自動處理事件,並且Ctrl-C應該再次按預期行事。這是因爲Qt事件循環將與python解釋器共享時間,而不是單獨運行,從而使解釋器有機會捕獲這些中斷。

相關問題