私はPyQt4に基づいてPython 2.7アプリケーションを持っています。特定のハンドラでCtrl + C(KeyboardInterrupt
、SIGINT
、2)を処理する必要があります。 Ctrl + Cを打つことによって作成された例外がtry-except
ブロックに捕捉されず、signal
ライブラリによって登録されたハンドラ関数には見られませんでした。 Ctrl + Cは何もしません!
私はPyQtなしで同じことをしようとしました - signal
がうまくいきます。
テストに使用されるコードはPyQt APIを使用しないため、どちらの場合でも確認できました。PyQtを使用したPythonアプリケーションでCtrl + Cを処理する方法は?
0
A
答えて
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)
これは説明と関係がありません。
関連する問題
- 1. Pythonを使用してCtrl + Cを送信する方法は?
- 2. Python cmdモジュールでCTRL-Cを処理する
- 3. Cエラー処理アプリケーションを使用して
- 4. Pythonを使用してcommoncrawlでバイナリデータを処理する方法
- 5. GNU Readlineを使ってCtrl + Dを処理する方法
- 6. コンソール(Ctrl-C)でPyQtアプリケーションを終了させる正しい方法は何ですか?
- 7. python opencvでC++アプリケーションが読み取るファイルを処理する方法は?
- 8. $ ctrlの処理方法。 AngularJSで?
- 9. vue.jsでペースト(Ctrl + vまたはマウスで)イベントを処理する方法は?
- 10. Ctrl-CがPyQtで動作しない
- 11. Pythonを使用してwit.ai botを処理する方法
- 12. Selenium Webdriver + Pythonを使用してポップオーバーを処理する方法
- 13. JavaでCtrl + Cのようなシステム割り込みを処理する方法
- 14. Python ftplib.all_errorsを使用したエラー処理
- 15. Selenium WebDriverをPythonで使用して国際化を処理する方法は?
- 16. ElementTree Pythonを使用してxmlパーサーでCDATAを処理する方法は?
- 17. Pythonを使用してSelenium WebDriverで認証ポップアップを処理する方法は?
- 18. Pythonでセレンを使ってダイアログボックスを処理する方法は?
- 19. Javaで処理するCtrl-Cを送信
- 20. PyQt - モジュールのインポート例外を処理する方法
- 21. CTRLでのSendKeys関数を使用する方法+ ALT + C
- 22. Pythonを使用してMysqlデータベースクエリを反復処理する方法は?
- 23. ステートメントを使用してC#がワークロードを処理する方法は?
- 24. JSONをJava/Springアプリケーションで使用する場合のスラッシュの処理方法は?
- 25. C#コードでxmlaを使用してキューブを処理する方法
- 26. asp.net/c#を使用してサーバーサイドでXMLHttpRequestを処理する方法
- 27. C#を使用してWebプロジェクトで例外を処理する方法
- 28. C#でWindowsインストーラのMsiSetExternalUIを使用してキャンセルボタンを処理する方法
- 29. pythonを使ってエラーを処理する方法は?
- 30. Pythonクラスを使ってRDDを処理する方法は?
これで、処理せずにプログラムを終了することができます。 Ctrl + Cを操作することは可能ですか? – Jury
'インポートsignal' 'インポートsys' ' DEF signal_term_handler(信号、フレーム):' SIGTERM'' 'sys.exit(0) ' ' signal.signal(signal.SIGTERMを得」 '印刷、 signal_term_handler) ' –