web-dev-qa-db-ja.com

pythonキーボード割り込みが機能しないのはなぜですか?(pycharm内)

私のpython try/exceptループは、pycharmでコードをデバッグしているときにCtrl + Cを押すとキーボード割り込みをトリガーしないようです。私のコードは次のようになります:

numbers = []
loop = True

try: 
    # ===========SUBROUTINES==================

    def help():
        print("To view the list type 'view'"
              "\n To add an item type 'add'"
              "\n To remove an item type 'remove'"
              "\n To exit type exit or Ctrl + c can be used at any time")

    # =========SUBROUTENES END===============


    while loop:
        task = input("What do you want to do? Type \"help\" for help:- ")
        if task == 'help':
            help()
        else:
            print("Invalid return please try again.")

    except KeyboardInterrupt:
        exit()

編集:スリム化されたコードが機能し、同じエラーが発生しないことに問題があるようです。完全なコードは、 ここ で確認できます。また、コード(上記のコード)をスリム化しましたが、同じエラーが発生しました。

7

スクリーンショットから、このコードをIDEで実行しているように見えます。 IDEの特徴は、特にキーボード文字の処理に関しては、通常の実行とまったく同じではないということです。 ctrl-cを押すと、IDEはテキストをコピーしたいと考えます。pythonプログラムは文字を認識しません。おそらく別のウィンドウが表示されます。実行中の場合は、ctrl-cの前にそのウィンドウを選択します。

6
tdelaney

変数「x」をコードに入れて、代わりにtabsを使用しているため、ここでは正常に機能していますspaces

try:

    def help():
        print("Help.")

    def doStuff():
        print("Doing Stuff")

    while True:
        x = int(input())
        if x == 1:
            help()
        Elif x == 2:
            doStuff()
        else:
            exit()

except KeyboardInterrupt:
    exit()
1
Nelthar

これは古い質問であることはわかっていますが、同じ問題に遭遇し、より簡単な解決策があると思います。

PyCharmで「実行」/「構成の編集」に移動し、「出力コンソールで端末をエミュレートする」をチェックします。 PyCharmがキーボード割り込みを受け入れるようになりました(コンソールがフォーカスされていることを確認してください)。

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

1
RawkFist

そのコメントで問題が解決しない場合は(@tdelaneyから)、シェルウィンドウにフォーカスを当てる必要があります(つまり、プログラムの実行中にクリックしたことを意味します)。 Control+C

1
BLang

PyCharmのPythonコンソールを使用し、Ctrl + Cを使用することもできます。Ctrl+ Cが押されたときにPyCharmが発生する例外をキャッチする場合。is_keyboard_interruptという短い関数を以下に記述しました例外がPyCharmを含むKeyboardInterruptであるかどうかを通知します。そうでない場合は、単純に再度レイズします。以下のコードの簡略版を貼り付けます。

実行すると:

  • 「help」と入力してEnterキーを押し、ループを繰り返します。
  • 他の何かを入力してEnterを押し、ValueErrorが適切に処理されていることを確認します。
  • Ctrl + Cを押して、PyCharmのpythonコンソールに含めて、KeyboardInterruptがキャッチされていることを確認します。

注:これはPyCharmのデバッガーコンソール(「実行」ではなく「デバッグ」によって呼び出されるもの)では機能しませんが、一時停止ボタンを押すだけでよいため、Ctrl + Cの必要性は少なくなります。

私はまた、これを私のGistに置いて、更新を行います: https://Gist.github.com/yulkang/14da861b271576a9eb1fa0f905351b97

def is_keyboard_interrupt(exception):
    # The second condition is necessary for it to work with the stop button
    # in PyCharm Python console.
    return (type(exception) is KeyboardInterrupt
            or type(exception).__name__ == 'KeyboardInterruptException')

try:
    def print_help():
        print("To exit type exit or Ctrl + c can be used at any time")
    print_help()

    while True:
        task = input("What do you want to do? Type \"help\" for help:- ")
        if task == 'help':
            print_help()
        else:
            print("Invalid input.")

            # to check that ValueError is handled separately
            raise ValueError()

except Exception as ex:
    try:
        # Catch all exceptions and test if it is KeyboardInterrupt, native or
        # PyCharm's.
        if not is_keyboard_interrupt(ex):
            raise ex

        print('KeyboardInterrupt caught as expected.')
        print('Exception type: %s' % type(ex).__name__)
        exit()

    except ValueError:
        print('ValueError!')
0
Yul Kang

Ctrl + cを押すときにウィンドウが選択されていることを確認してください。私はあなたのプログラムをIDLEで実行しましたが、それは私にとって完璧に機能しました。

0
cnmcferren