необработанный ввод в python без нажатия enter

Я использую raw_input в Python для взаимодействия с пользователем в консоли.

c = raw_input('Press s or n to continue:')
if c.upper() == 'S':
    print 'YES'

он работает по назначению, но пользователь должен нажать enter в оболочке после нажатия "s". Есть ли способ выполнить то, что мне нужно от пользовательского ввода без необходимости нажимать enter в оболочке? Я использую машины * nixes.

6 ответов


под Windows, вам понадобится msvcrt модуль, в частности, кажется, из того, как вы описываете свою проблему, функция msvcrt.getch:

прочитайте нажатие клавиши и верните результирующий характер. Ничего не повторяется к консоли. Этот вызов блокирует если клавиши уже не доступно, но не будет ждать ввода чтобы на него надавили.

(etc -- см. документы, на которые я только что указал). Для Unix, см., например,этот рецепт для простого способа построить подобный getch функция (см. также несколько альтернатив &c в потоке комментариев этого рецепта).


Python не предоставляет мультиплатформенное решение из коробки.
Если вы находитесь в Windows, вы можете попробовать msvcrt С:

import msvcrt
print 'Press s or n to continue:\n'
input_char = msvcrt.getch()
if input_char.upper() == 'S': 
   print 'YES'

вместо


проклятия могут сделать это:

import curses, time

#--------------------------------------
def input_char(message):
    try:
        win = curses.initscr()
        win.addstr(0, 0, message)
        while True: 
            ch = win.getch()
            if ch in range(32, 127): break
            time.sleep(0.05)
    except: raise
    finally:
        curses.endwin()
    return chr(ch)
#--------------------------------------
c = input_char('Press s or n to continue:')
if c.upper() == 'S':
    print 'YES'

чтобы получить один символ, я использую getch, но я не знаю, работает ли он на Windows.


на боковой ноте, msvcrt.kbhit () возвращает логическое значение, определяющее, нажата ли в данный момент какая-либо клавиша на клавиатуре.

поэтому, если вы делаете игру или что-то еще и хотите, чтобы нажатия клавиш делали что-то, но не останавливали игру полностью, вы можете использовать kbhit() внутри оператора if, чтобы убедиться, что ключ извлекается только если пользователь действительно хочет что-то сделать.

пример в Python 3:

# this would be in some kind of check_input function
if msvcrt.kbhit():
    key = msvcrt.getch().decode("utf-8").lower() # getch() returns bytes data that we need to decode in order to read properly. i also forced lowercase which is optional but recommended
    if key == "w": # here 'w' is used as an example
        # do stuff
    elif key == "a":
        # do other stuff
    elif key == "j":
        # you get the point