Прерывание клавиатуры в режиме отладки PyCharm

Есть ли способ отправить событие прерывания клавиатуры в PyCharm IDE (3.1) в режиме отладки?

Мне нужно то же самое. Мне нужно иметь возможность изящно останавливать сценарий с обработкой кода с помощью CTRL-C или подобного, а не просто использовать кнопку «Стоп».   —  person arbulgazar    schedule 28.04.2014

Очевидно, нет: посмотрите и проголосуйте за это. это для CLion, но, видимо, если его изменить, он также изменит PyCharm.   —  person arbulgazar    schedule 08.07.2020

Также обратите внимание, что в последних версиях большой красный квадрат отправляет SIGINT, ждет одну секунду, а затем SIGTERM. Если ваша очистка достаточно быстрая, это может сработать для вас.   —  person arbulgazar    schedule 08.07.2020

См. также:  Почему R? Ни Excel, ни Python
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 5
  1. 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 установлен. Ты можешь проверить:

    введите здесь описание изображения

    Убедитесь, что вы правильно настроили интерпретатор:

    введите здесь описание изображения

    Если вы еще не установили psutil, вы всегда можете сделать это с помощью кнопки Установить.

    Итак, теперь, когда мы все настроили, давайте отладим программу:

    введите здесь описание изображения

    Теперь все, что нам нужно сделать, это получить идентификатор процесса, и мы можем получить его в самом начале программы:

    введите здесь описание изображения

    Итак, давайте запустим нашу консоль и отправим сигнал:

    введите здесь описание изображения

    И если это сработало правильно, вы должны увидеть окончание цикла while:

    введите здесь описание изображения

    Вы можете еще больше упростить процесс, добавив функцию отправки прерывания в стартовый скрипт для вашей консоли:

    введите здесь описание изображения

    Когда вы закончите со всем этим, все, что вам нужно сделать, это вызвать interrupt(<pid here>), чтобы вызвать прерывание клавиатуры в вашем процессе.

    Я надеюсь, что это отвечает на ваш вопрос.

    Благодарность! Это точно ответ. Надеемся, что Jetbrains создаст более удобные способы для этого в своих будущих выпусках. person arbulgazar; 30.05.2014

    Рада что тебе понравилось. Но это довольно утомительно в PyCharm, и я надеюсь, что это быстро исправят. person arbulgazar; 30.05.2014

    Есть ли способ как-то получить PID в сценарии запуска? В приложениях, которые много печатают, через полчаса после запуска толком не заглянешь в начало лога консоли. person arbulgazar; 05.08.2015

    @Pastafarianist Я не знаю, есть ли он, значит, это ошибка. person arbulgazar; 05.08.2015

    Спасибо большое, никто не мог ожидать более подробного ответа! person arbulgazar; 25.11.2015

  2. arbulgazar

    Это ошибка в PyCharm. См.: https://youtrack.jetbrains.com/issue/PY-4840.

    Прерывание клавиатуры — это SIGINT. В системах unix вы можете перейти в командную строку и выполнить:

    $ kill -INT <pid>
    

    или в питоне:

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

    Ошибка для PyCharm была закрыта как исправленная — попытка повторного открытия. person arbulgazar; 17.08.2015

    Здесь хорошее и простое решение, этому ответу нужно больше голосов. person arbulgazar; 10.05.2019

    @Отметьте (и проголосуйте!) com/issue/ … для CLion, но, очевидно, если изменить его там, он также изменит PyCharm. person arbulgazar; 08.07.2020

  3. arbulgazar

    Кнопка PyCharm Stop теперь отправляет SIGINT как в режиме отладки, так и в режиме выполнения. Если SIGINT не завершает программу, кнопка Стоп меняет свой сигнал на SIGKILL. Он также меняет свой значок на форму черепа:

    Посмотрите, как изменился значок кнопки

    Любые мысли о том, как всегда отправлять SIGKILL? Маленький череп появляется каждый раз, когда я пытаюсь остановить отладку, это довольно надоедливо. person arbulgazar; 09.03.2017

    @MikeyE Отправка SIGKILL по умолчанию — плохая идея. Это может оставить дочерние процессы запущенными и избежать очистки. В любом случае, если вы решили, что вам это все равно нужно, вы можете попробовать закрыть программу (кнопка с крестиком, т.е. Ctrl+F4). person arbulgazar; 10.03.2017

    Это может быть плохой идеей, но именно это PyCharm делает по умолчанию, если процесс нельзя остановить. В моем случае это буквально каждый раз, когда я нажимаю кнопку остановки. Возможно, было бы лучше послать другой сигнал. Но независимо от того, как вы это делаете в PyCharm? person arbulgazar; 12.03.2017

    @milaniez Вы знаете, в какой версии появилась эта функция? Кажется, на моем Mac отправляется SIGINT, но с Windows PyCharm 2017.1.5 программа немедленно завершается как в режиме отладки, так и в режиме выполнения. person arbulgazar; 21.09.2017

    Обратите внимание, что перед отправкой SIGKILL существует задержка в одну секунду. Если для очистки требуется больше, вам не повезло): Однако отправка SIGINT в процесс (либо с помощью терминала, либо с помощью psutils в соответствии с ответом GamesBraniac) также работает. person arbulgazar; 08.07.2020

  4. arbulgazar

    Я наткнулся на это сообщение во время поиска этой проблемы в отслеживании ошибок Pycharm: https://youtrack.jetbrains.com/issue/PY-4840

    Если вы используете версию Pycharm 3, это может помочь, у меня сработало.

    Один из комментариев в трекере: «На самом деле я обнаружил, что Ctrl+C в конце концов останавливает запущенный скрипт, но вы должны сначала написать письмо в консоль, пока он работает. Итак, щелкните в окне консоли, нажмите любую клавишу, а затем нажмите Ctrl-C. Другими словами, это похоже на проблему с получением фокуса кадра GUI».

    Это не работает в PyCharm 2019.3.1 (Community Edition). person arbulgazar; 26.02.2020

    Это помогает в научном режиме версии 2020.3.4. person arbulgazar; 18.03.2021

  5. arbulgazar

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

    В последних версиях PyCharm вы можете включить Emulate terminal in output console в своей конфигурации запуска — это позволяет Ctrl + C в консоли запуска отправлять прерывание клавиатуры.

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

    введите описание изображения здесь

    Также это нарушит библиотеку tqdm:

    введите описание изображения здесь

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: