Python: Не можете непрерывно перехватывать клавиатурные прерывания в Windows?

1

В Python я написал следующий код, чтобы узнать, могу ли я заставить мою программу не останавливаться на Control + C, как и все эти причудливые терминальные приложения, такие как Vim или Dwarf Fortress.

def getinput():
    x = input('enter something: ')
while True:
    try:
            getinput()
    except KeyboardInterrupt:
            pass

К сожалению, в консоли Windows этот script завершается через несколько секунд. Если я запускаю его в IDLE, он работает так, как ожидалось. Версия Python 3.2.1, 3.2 действовала одинаково. Я что-то делаю неправильно?

РЕДАКТИРОВАТЬ: Если я удерживаю, Control + C, то есть.

  • 1
    У меня работает на консоли Windows, Python 3.2. Что вы ожидаете, и что на самом деле происходит? Какая ошибка возникает?
  • 0
    Я отредактировал ответ, чтобы быть более понятным. Если я удерживаю Control + C, в консоли он завершается без ошибки, тогда как IDLE работает как положено и продолжает отображать «ввести что-то:».
Теги:
terminal

1 ответ

2
Лучший ответ

Чтобы не заканчиваться на Control-C, вам нужно установить обработчик сигнала. Из документа Python здесь

Python устанавливает небольшое количество обработчики сигналов по умолчанию: SIGPIPE игнорируются (поэтому записывайте ошибки на трубах и сокеты можно сообщать как обычные Исключения Python) и SIGINT переведенный в KeyboardInterrupt исключение. Все это может быть переопределяется.

Итак, вам нужно будет установить обработчик сигнала, чтобы поймать сигнал SIGINT и сделать то, что вы хотите.

Поведение с IDLE, вероятно, связано с тем, что у них установлен обработчик, который блокирует выход приложения.

  • 0
    Интерактивный переводчик из командной строки Windows также работает без проблем, так что все имеет смысл. Спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню