2011-03-01 15 views
10

なぜCtrl + C PyQtを使用するPythonプログラムを中断させることができますか?私はそれをデバッグしてスタックトレースを取得したいと思います。何らかの理由でこれをC++よりも難しくしています!Ctrl-CがPyQtで動作しない

+0

使用しているOSはどれですか? –

+4

あなたはGoogleを使っているべきです;-) [あなたの問題は解決策で説明されています](http://www.mail-archive.com/[email protected]/msg13757.html) – user225312

+0

@A A - 素敵!私はそれがCtrl + C対Ctrl + Dの状況だと思った。 –

答えて

19

CTRL + Cは、処理を に送信します。 Pythonは シグナルをキャッチし、グローバル変数、 をCTRL_C_PRESSED = Trueのように設定します。 次に、Pythonインタプリタ が新しいオペコードを実行すると、 変数が認識され、 KeybordInterruptが発生します。

これは、 Pythonインタープリタが回転している場合にのみ、CTRL + Cが機能することを意味します。 拡張モジュールが実行されている場合、 は長時間実行される操作を実行します。 がPythonと明示的に「協力」しない限り、CTRL + Cは中断しません。 例:time.sleep()は理論的にはブロック操作である ですが、この関数の 実装では、Python インタプリタと "協力して" CTRL + Cを動作させます。

これはすべて仕様によるものです.CTRL + Cは、「クリーンアボート」を行うには を意味します。これが が Pythonによって例外に変わった理由です(その結果、クリーンアップはスタックアンワインド時に が実行されます)、拡張モジュールによる のサポートは "opt-in"のソート です。 を完全に処理したい場合は、処理を中止する チャンスを与えずに、CTRL +を使用できます。

PythonははQApplication :: execの() (C++関数が)、Qtは CTRL + CのためのPythonと "協力" する方法 を知らないを呼び出し、それがない 作業を行う理由です。私は良い方法があるとは思わない。 "それを働かせる";グローバル イベントフィルタを使用して処理できる場合は、 が必要です。 - Giovanni Bajo

これをメインプログラムに追加すると問題が解決しました。

import signal 

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

これは説明と関係がありません。

+1

私はこれが何をするのか分かりませんが、完璧に動作します!編集:SIGINT(= Ctrl + C)がデフォルトのアクション(=終了)を行うべきであるように、[ここ](https://docs.python.org/3/library/signal.html) 。 – z3ntu

2

は、私はニール・Gに同意し、これを追加します。

あなたがないコールQApplication.exec_を行う場合は()のpythonを使用して(イベントループを開始し、代わりに、Pythonの対話シェルでプログラムを実行します-i)、対話型プロンプトが待機しているときはいつでも、pyqtは自動的にイベントを処理し、Ctrl-Cは再び期待通りに動作するはずです。これは、Qtイベントループが排他的に実行されるのではなく、Pythonインタプリタと時間を共有し、インタープリタがそれらの割り込みを捕まえることができるようにするためです。

関連する問題