web-dev-qa-db-ja.com

デバッグモードPyCharmでのキーボード割り込み

デバッグモードでPyCharm IDE(3.1)でキーボード割り込みイベントを送信する方法はありますか?

30
arbulgazar

残念ながら、これを行う簡単な方法はありません。 psutilおよびsignalモジュールを使用する必要があります。これを機能させるには、psutilをインストールする必要があります。これを行うには、pipを使用するのが最善の方法です。

_pip install psutil
_

それでは、ここに展示Aがあるとします。

_while True:
    try:
        time.sleep(3)
        print "Zzzz"
        time.sleep(3)
        print("gong!")
    except KeyboardInterrupt as e:
        print "Closed by an Interrupt"
        break
_

そして、あなたはこれをPyCharmで実行しています。使用しているインタープリターにpsutilsがインストールされていることを確認してください。確認してもいい:

enter image description here

インタプリタが正しく設定されていることを確認してください:

enter image description here

psutilをインストールしていない場合は、いつでもインストールできます Install ボタン。

では、すべての設定が完了したので、プログラムをデバッグしましょう。

enter image description here

ここで必要なのは、プロセスIDを取得することだけです。これは、プログラムの開始時に取得できます。

enter image description here

それでは、コンソールを起動してシグナルを送信しましょう。

enter image description here

そして、それが適切に機能した場合は、whileループが終了することがわかります。

enter image description here

コンソールの開始スクリプトに割り込みを送信する関数を追加することで、プロセスをさらに効率化できます。

enter image description here

すべての処理が完了したら、interrupt(<pid here>)を呼び出して、プロセスのキーボード割り込みを呼び出すだけです。

それがあなたの質問に答えることを願っています。

18
Games Brainiac

PyCharmStopボタンは、デバッグモードと実行モードの両方でSIGINTを送信するようになりました。 SIGINTがプログラムを終了しない場合、Stopボタンは信号をSIGKILLに変更します。また、アイコンを頭蓋骨の形に変更します。

See how the stop button changed its icon

12
milaniez

これはPyCharmのバグです。参照: http://youtrack.jetbrains.com/issue/PY-484

キーボード割り込みはSIGINTです。 UNIXシステムでは、コマンドラインに移動して次のいずれかを実行できます。

$ kill -INT <pid>

またはPythonで:

import os, signal
os.kill(<pid>,signal.SIGINT)
8
dvj

このコメントで述べたように- なぜこれができないのですかpythonキーボード割り込みが機能しますか?(pycharm内)

PyCharmの最近のバージョンでは、Emulate terminal in output console実行構成-これにより、 Ctrl + C 実行コンソールでキーボード割り込みを送信します。

PyCharm 2018.3(コミュニティ版)でテスト済み:

enter image description here

また、これは tqdm ライブラリを壊します:

enter image description here

2
Mr. Che

この問題についてPycharmのバグ追跡を検索しているときに、このメッセージが表示されました: https://youtrack.jetbrains.com/issue/PY-484

バージョンPycharm 3を使用している場合、これは役立つかもしれませんが、私にとってはうまくいきました。

トラッカーのコメントの1つ:「実際にCtrl + Cを実行するとスクリプトの実行が最終的に停止することがわかりましたが、実行中にコンソールに文字を最初に書き込む必要があります。コンソールウィンドウをクリックして、任意のキーを押し、Ctrl-Cを押します。言い換えれば、GUIフレームがフォーカスを取得する問題のように見えます。

1
damaZhang