Почему это прерывание клавиатуры python не работает? (в пичарме)

Мой цикл try/except в python, похоже, не вызывает прерывание клавиатуры при нажатии Ctrl + C во время отладки моего кода в pycharm. Мой код выглядит так:

try:
    while loop:
        print("busy")

except KeyboardInterrupt:
    exit()

EDIT: Кажется, есть некоторые проблемы с моим сокращенным кодом, который работает и не выдает ту же ошибку. Полный код можно посмотреть здесь. Я также повторно уменьшил код (код выше), и он выдал ту же ошибку.


person Edwin Shepherd    schedule 30.09.2016    source источник
comment
В вашем опубликованном коде есть ошибка (x не определен), и когда я добавляю x = 2, он печатает Doing Stuff, пока я не нажму ctrl-c, а затем закрывается. Я не могу воспроизвести вашу проблему в Linux.   -  person tdelaney    schedule 30.09.2016
comment
Новый код по-прежнему работает при запуске из оболочки.   -  person tdelaney    schedule 30.09.2016
comment
При запуске из оболочки я получаю SyntaxError: multiple statements found while compiling a single statement   -  person Edwin Shepherd    schedule 30.09.2016


Ответы (9)


Из вашего снимка экрана видно, что вы запускаете этот код в среде IDE. Дело в том, что IDE работают не совсем так, как обычно, особенно когда речь идет об обработке символов клавиатуры. Когда вы нажимаете ctrl-c, ваша IDE думает, что вы хотите скопировать текст. Программа python никогда не видит символ. Возможно, при запуске появляется отдельное окно? Затем вы бы выбрали это окно перед ctrl-c.

person tdelaney    schedule 30.09.2016
comment
Просто для тех, кто хочет использовать этот вопрос: сочетание клавиш для прерывания клавиатуры в pycharm — Ctrl + F2 - person Edwin Shepherd; 30.09.2016
comment
Нет, Ctrl-F2 эквивалентно нажатию кнопки «стоп» PyCharm. Это не отправляет прерывание клавиатуры, поэтому ваш процесс просто остановится, а не выйдет через любую необходимую очистку. - person user3468054; 22.12.2016
comment
В последних версиях PyCharm вы можете включить Emulate terminal in output console в своей конфигурации запуска — это позволяет Ctrl + C в консоли запуска отправлять прерывание клавиатуры. - person Christopher Gurnee; 08.06.2017
comment
Эмуляция терминала в консоли вывода, кажется, работает в этом случае, но мне нужно нажать «ввод» после ctrl^c, так что это не совсем то же самое, что в командной строке. К сожалению, в других случаях он не работает надежно. У меня нет простого, чтобы поделиться, но кажется, что ctrl c не влияет на мой скрипт. Не уверен, почему. - person poleguy; 31.08.2017
comment
@ChristopherGurnee Спасибо за это. Я имел дело с неправильным завершением потоков из-за кнопки остановки Pycharm, так как не мог понять, как туда добавить SIGINT. - person Derek; 09.02.2018

Я знаю, что это старый вопрос, но я столкнулся с той же проблемой и думаю, что есть более простое решение:

В PyCharm перейдите в «Выполнить»/«Редактировать конфигурации» и установите флажок «Эмулировать терминал в выходной консоли». PyCharm теперь принимает прерывания клавиатуры (убедитесь, что консоль сфокусирована).

Протестировано на: PyCharm 2019.1 (Community Edition)

person RawkFist    schedule 25.02.2020

Консоль Python PyCharm вызывает исключение console_thrift.KeyboardInterruptException при нажатии Ctrl-C вместо KeyboardInterrupt. Исключение console_thrift.KeyboardInterruptException не является подклассом KeyboardInterrupt, поэтому не попадает в строку except KeyboardInterrupt.

Добавление следующих строк сделает ваш скрипт совместимым с PyCharm.

try:
    from console_thrift import KeyboardInterruptException as KeyboardInterrupt
except ImportError:
    pass

Это не нарушило бы совместимости с запуском скрипта в терминале или другой среде IDE, такой как IDLE или Spyder, поскольку модуль console_thrift находится только в PyCharm.

person Friedrich S    schedule 29.10.2020

Если этот комментарий не решит вашу проблему (от @tdelaney), вам нужно сфокусировать окно оболочки (это означает, что вы щелкнули по нему во время работы программы), а затем вы можете использовать Control+С

person BLang    schedule 30.09.2016
comment
Однако все, что я делаю, это выделяет печатное заявление. См. это: imgur.com/M43LPuu - person Edwin Shepherd; 30.09.2016
comment
@Edwinthebreadwin - сообщите нам, какую IDE вы используете. Вероятно, он перехватывает ctrl-c и делает что-то еще... например, копирование! - person tdelaney; 30.09.2016
comment
Я использую версию сообщества pycharm, но я только что запустил ее в IDLE, и это тоже не работает imgur.com/a/ZKAus - person Edwin Shepherd; 30.09.2016
comment
Да, это копирование, есть идеи, как это остановить? - person Edwin Shepherd; 30.09.2016
comment
Игнорирование принятого ответа в этом сообщении /questions/22913490/, другой ответ говорит, что вы просто нажимаете кнопку STOP. У меня нет pycharm и я не могу проверить. - person tdelaney; 30.09.2016

Вы также можете использовать консоль Python PyCharm и использовать Ctrl + C, если вы поймаете исключение, которое PyCharm вызывает при нажатии Ctrl + C. Ниже я написал короткую функцию под названием is_keyboard_interrupt, которая сообщает вам, является ли исключение KeyboardInterrupt, включая PyCharm. Если это не так, просто переподнимите его. Я вставляю упрощенную версию кода ниже.

Когда он запущен:

  • введите «помощь» и нажмите Enter, чтобы повторить цикл.
  • введите что-нибудь еще и нажмите Enter, чтобы убедиться, что ValueError обрабатывается правильно.
  • Нажмите Ctrl + C, чтобы убедиться, что KeyboardInterrupt перехвачен, в том числе в консоли Python PyCharm.

Примечание. Это не работает с консолью отладчика 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!')
person Yul Kang    schedule 28.03.2020

Здесь работает нормально, так как я поместил переменную "x" в ваш код и использую табуляции вместо пробелов.

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()
person Nelthar    schedule 30.09.2016

Попробуйте Shift + Control + C. Это сработало для меня.

person Naveen Kumar AG    schedule 26.07.2021

Убедитесь, что окно выбрано при нажатии ctrl+c. Я только что запустил вашу программу в IDLE, и она отлично сработала для меня.

person cnmcferren    schedule 30.09.2016
comment
@Edwinthebreadwin ваше утверждение except имеет слишком большой отступ. Операторы try: и except: должны иметь одинаковый отступ, чтобы они работали правильно. надеюсь, это поможет - person cnmcferren; 30.09.2016

Одна из возможных причин, если ‹Strg+C› не останавливает программу:

Когда текст помечен в оболочке, ‹Strg+C› интерпретируется как копирование помеченного текста в буфер обмена.

Просто снимите выделение с текста и снова нажмите ‹Strg+C›.

person user14897633    schedule 27.12.2020