Сегодня мне нужно было проверить, как работает мой script в командной строке Windows [1] когда я заметил что-то странное. Я работал над чем-то подобным, но этого достаточно, чтобы продемонстрировать проблему. Вот код.
def bing():
try:
raw_input()
except KeyboardInterrupt:
print 'This is what actually happened here!'
try: # pardon me for those weird strings
bing() # as it consistent with everything in the chat room (see below)
print 'Yoo hoo...'
except KeyboardInterrupt:
print 'Nothing happens here too!'
Вот ситуация. Когда выполняется script, он ждет ввода, и пользователь должен нажать Ctrl + C, чтобы поднять KeyboardInterrupt
, который (должен) был бы улавливан блоком except
в пределах bing()
. Таким образом, это должен быть фактический результат. И это происходит, когда я запускаю его на своем терминале Ubuntu и IDLE (как на Windows, так и на Ubuntu).
This is what actually happened here!
Yoo hoo...
Но это не так, как ожидалось, в командной строке Windows. Я скорее получаю странный результат.
This is what actually happened here! Nothing happens here too!
Похоже, что один KeyboardInterrupt
распространяется по всей программе и, наконец, завершает его.
Я пробовал все, что мог. Во-первых, я использовал signal.signal
для обработки SIGINT
(который не работал), а затем я использовал функцию обработки, чтобы поднять Exception
, который я позже поймал (и это тоже не сработало), и тогда все усложнилось, чем раньше. Итак, я приземлился на старый добрый try... catch
. Затем я пошел в комнату для питонистов.
@poke предложил, что при нажатии Ctrl + C повышается EOFError
. Затем @ZeroPiraeus сказал, что EOFError
возникает при нажатии Ctrl + Z и Enter.
Это было полезно, что привело к обсуждению после нескольких минут прокрутки. Вскоре все стало хаосом! Некоторые результаты были хорошими, некоторые были неожиданными, и несколько пошли haywire!
Вывод состоял в том, чтобы прекратить использование Windows и попросить моих друзей использовать терминал (я согласен). Однако я мог бы сделать обходной путь, поймав EOFError
вместе с KeyboardInterrupt
. Хотя лениво нажимать Ctrl + Z и Enter каждый раз, это не большая проблема для меня. Но для меня это одержимость.
В ходе дальнейших исследований я также заметил, что там нет KeyboardInterrupt
, поднятых на CMD, когда я нажимаю Ctrl + C.
Там ничего нет. Итак, что здесь происходит? Почему распространяется KeyboardInterrupt
? Есть ли способ (вообще) сделать вывод совместимым с терминалом?
[1]: Я всегда работал на терминале, но сегодня мне нужно было убедиться, что мой script работает на всех платформах (особенно потому, что большинство моих друзей не являются кодовыми и просто привязаны к Windows).