Как заставить python ждать нажатой клавиши

Я хочу, чтобы мой script подождал, пока пользователь нажмет любую клавишу.

Как это сделать?

Ответ 1

В Python 3 не существует raw_input(). Итак, просто используйте:

input("Press Enter to continue...")

В Python 2 вы должны использовать raw_input(), поскольку input(prompt) эквивалентен eval(raw_input(prompt)):

raw_input("Press Enter to continue...")

Это только ждет, пока пользователь нажмет ввод, поэтому вы можете использовать msvcrt ((только для Windows/DOS). Модуль msvcrt предоставляет вам доступ к ряду функций в Microsoft Visual C/C++ Runtime Library (MSVCRT) ):

import msvcrt as m
def wait():
    m.getch()

Это должно ждать нажатия клавиши.

Ответ 2

Один из способов сделать это в Python 2 - использовать raw_input():

raw_input("Press Enter to continue...")

В python3 это просто input()

Ответ 3

На моем компьютере с Linux я использую следующий код. Это похоже на код, который я видел в другом месте (например, в старых FAQ по Python), но этот код вращается в узком цикле, где этого кода нет, и есть много странных угловых случаев, которые код не учитывает код делает.

def read_single_keypress():
    """Waits for a single keypress on stdin.

    This is a silly function to call if you need to do it a lot because it has
    to store stdin current setup, setup stdin for reading single keystrokes
    then read the single keystroke then revert stdin back after reading the
    keystroke.

    Returns a tuple of characters of the key that was pressed - on Linux, 
    pressing keys like up arrow results in a sequence of characters. Returns 
    ('\x03',) on KeyboardInterrupt which can happen when a signal gets
    handled.

    """
    import termios, fcntl, sys, os
    fd = sys.stdin.fileno()
    # save old state
    flags_save = fcntl.fcntl(fd, fcntl.F_GETFL)
    attrs_save = termios.tcgetattr(fd)
    # make raw - the way to do this comes from the termios(3) man page.
    attrs = list(attrs_save) # copy the stored version to update
    # iflag
    attrs[0] &= ~(termios.IGNBRK | termios.BRKINT | termios.PARMRK
                  | termios.ISTRIP | termios.INLCR | termios. IGNCR
                  | termios.ICRNL | termios.IXON )
    # oflag
    attrs[1] &= ~termios.OPOST
    # cflag
    attrs[2] &= ~(termios.CSIZE | termios. PARENB)
    attrs[2] |= termios.CS8
    # lflag
    attrs[3] &= ~(termios.ECHONL | termios.ECHO | termios.ICANON
                  | termios.ISIG | termios.IEXTEN)
    termios.tcsetattr(fd, termios.TCSANOW, attrs)
    # turn off non-blocking
    fcntl.fcntl(fd, fcntl.F_SETFL, flags_save & ~os.O_NONBLOCK)
    # read a single keystroke
    ret = []
    try:
        ret.append(sys.stdin.read(1)) # returns a single character
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save | os.O_NONBLOCK)
        c = sys.stdin.read(1) # returns a single character
        while len(c) > 0:
            ret.append(c)
            c = sys.stdin.read(1)
    except KeyboardInterrupt:
        ret.append('\x03')
    finally:
        # restore old state
        termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save)
        fcntl.fcntl(fd, fcntl.F_SETFL, flags_save)
    return tuple(ret)

Ответ 4

Если вы в порядке, в зависимости от системных команд вы можете использовать следующее:

Linux:

os.system('read -s -n 1 -p "Press any key to continue..."')
print

Окна:

os.system("pause")

Ответ 5

Просто используя

input("Press Enter to continue...")

вызовет SyntaxError: ожидаемый EOF во время разбора.

Простое использование исправлений:

try:
    input("Press enter to continue")
except SyntaxError:
    pass

Ответ 6

Руководство python предоставляет следующее:

import termios, fcntl, sys, os
fd = sys.stdin.fileno()

oldterm = termios.tcgetattr(fd)
newattr = termios.tcgetattr(fd)
newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, newattr)

oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)

try:
    while 1:
        try:
            c = sys.stdin.read(1)
            print "Got character", repr(c)
        except IOError: pass
finally:
    termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)

который можно перевернуть в ваш прецедент.

Ответ 7

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

import msvcrt
c = msvcrt.getch()
print 'you entered', c

mscvcrt также включает неблокирующую функцию kbhit(), чтобы увидеть, был ли нажат ключ без ожидания (не уверен, есть ли соответствующая функция curses). В UNIX есть пакет curses, но не уверен, можете ли вы использовать его, не используя его для всего вывода экрана. Этот код работает под UNIX:

import curses
stdscr = curses.initscr()
c = stdscr.getch()
print 'you entered', chr(c)
curses.endwin()

Обратите внимание, что curses.getch() возвращает порядковый номер нажатой клавиши, чтобы он имел тот же результат, что и я.

Ответ 8

Кросс-платформа, код Python 2/3:

# import sys, os

def wait_key():
    ''' Wait for a key press on the console and return it. '''
    result = None
    if os.name == 'nt':
        import msvcrt
        result = msvcrt.getch()
    else:
        import termios
        fd = sys.stdin.fileno()

        oldterm = termios.tcgetattr(fd)
        newattr = termios.tcgetattr(fd)
        newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
        termios.tcsetattr(fd, termios.TCSANOW, newattr)

        try:
            result = sys.stdin.read(1)
        except IOError:
            pass
        finally:
            termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)

    return result

Я удалил fctl/non-blocking, потому что он давал IOError, и мне это не нужно. Я использую этот код специально, потому что хочу его заблокировать.;)

Ответ 9

Я новичок в python, и я уже думал, что я слишком глуп, чтобы воспроизвести самые простые предложения, сделанные здесь. Оказывается, там должна быть ошибка:

Когда python- script выполняется из IDLE, некоторые IO-команды, похоже, ведут себя совершенно иначе (поскольку на самом деле нет окна терминала).

Eg. msvcrt.getch не блокирует и всегда возвращает $ff. Об этом уже сообщалось давно (см., Например, https://bugs.python.org/issue9290) - и он отмечен как фиксированный, так как проблема, похоже, сохраняется в текущих версиях питон /IDLE.

Итак, если какой-либо из вышеперечисленного кода не работает для вас, попробуйте вручную запустить script и NOT из IDLE.

Ответ 10

Если вы хотите увидеть, нажали ли они точный ключ (например, "b" ) Сделайте следующее:

while True:
    choice = raw_input("> ")

    if choice == 'b' :
        print "You win"
        input("yay")
        break

Ответ 11

os.system, похоже, всегда вызывает sh, которая не распознает параметры s и n для чтения. Однако команда чтения может быть передана в bash:

 os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")

Ответ 12

Если вы хотите подождать ввода (чтобы пользователь, стучавший по клавиатуре, не вызывал непредвиденных ситуаций), используйте

sys.stdin.readline()

Ответ 13

или вы могли бы сделать

print("This is a good joke")
print("what happened when the chicken crossed the road")
gap = input("")
if gap == (""):
    print("")
else:
    print("")
print("it died")