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

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

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

Решение

В 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...")

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

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

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

Комментарии (7)

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

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

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

Комментарии (4)

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

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's 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)
Комментарии (7)

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

Линукс:

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

Окна:

os.system("pause")
Комментарии (1)

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

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

вызывает синтаксис ошибка: ожидается ВФ при синтаксическом анализе.

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

try:
    input("Press enter to continue")
except SyntaxError:
    pass
Комментарии (4)

В [руководстве] python 1 приведено следующее:

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)

которые могут быть использованы в вашем случае.

Комментарии (3)

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

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

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

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

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

Комментарии (1)

Кросс-платформенный код на 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/неблокирующий вещи, потому что это дает `IOError и я вовсе'т это нужно. Я'м, используя этот код специально, потому что я хочу, чтобы это заблокировать. ;)

Комментарии (0)

Если вы хотите ждать введите (так пользователя стук клавиатуры не вызывает что-случиться) использовать

sys.stdin.readline()
Комментарии (1)

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

Когда питон-скрипт выполняется от простоя, некоторые ИО-команды, кажется, ведут себя совершенно иначе (как там на самом деле нет окна терминала).

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

Так что если он код выложил выше не't работа для вас, попробуйте запустить скрипт вручную, а не из праздного.

Комментарии (0)

Если вы хотите, чтобы увидеть, если они давят точный ключ (как говорят 'б') этого:

while True:
    choice = raw_input("> ")

    if choice == 'b' :
        print "You win"
        input("yay")
        break
Комментарии (1)

ОС.система, кажется, всегда ссылаться на Ш., которая не признает S и N вариантов для чтения. Однако команда чтения может быть передан на баш:

 os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")
Комментарии (1)