РЕДАКТИРОВАТЬ: Гвидо отредактировал для меня принятый ответ, поэтому этот ответ больше не нужен.
Принятый ответ больше не работает из-за изменений, сделанных Мухаммедом. Я попытался внести исправление, но оно продолжает отклоняться, поэтому я опубликую его как отдельный ответ. Мой код почти идентичен его, только 1 крошечное изменение:
import sys
import select
import tty
import termios
from curses import ascii
def isData():
return select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], [])
old_settings = termios.tcgetattr(sys.stdin)
try:
tty.setcbreak(sys.stdin.fileno())
i = 0
while 1:
print i
i += 1
if isData():
c = sys.stdin.read(1)
if c == chr(ascii.ESC):
break
finally:
termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
Единственное отличие состоит в том, что вместо "c == ascii.ESC" я изменил его на "c == chr (ascii.ESC). Я и еще один разработчик протестировали и подтвердили, что это изменение необходимо и что в противном случае программа не будет работать правильно.
Предполагается, что программа будет показывать все большие и большие цифры, пока вы не нажмете ESC, а затем выйдете. Но без chr () вокруг ascii.ESC он не обнаружит нажатие вашей клавиши ESC.