2009-06-11 6 views

ответ

280

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

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

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

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

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

+39

Я получаю эту ошибку, когда пытаюсь сделать это в Python 2.7: «SyntaxError: неожиданный EOF при разборе « –

+0

@richard многие люди используют Windows, поэтому +1. – Solarsaturn9

+6

@ Solarsaturn9 и все больше и больше нет. Таким образом, этот ответ не сработал для меня и многих других, которые пришли сюда. –

271

Один из способов сделать это в Python 2, заключается в использовании raw_input():

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

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

+14

Как насчет того, когда это может быть одно из нескольких ключей? Не просто 'enter'? – noio

+32

[С Python 3+] (http://stackoverflow.com/questions/954834/easy-how-to-use-raw-input-in-3-1), это изменилось только на 'input()'. – palswim

+2

http://stackoverflow.com/questions/1394956/how-to-do-hit-any-key-in-python –

14

Питон manual обеспечивает следующее:

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) 

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

+10

Рекомендуется скопировать то, с чем вы связываетесь, чтобы знание оставалось, даже если ссылка умирает (и они делают!). – Richard

+1

Как я могу сделать эту работу в Python 3.x? В 3.x после изменения оператора печати, который будет совместим, это просто циклически бесконечно и не ждет ввода. Однако он отлично работает на Python 2. – cat

+0

Ссылка была обновлена, чтобы перенаправить на другую страницу. Новая ссылка - [здесь.] (Https://docs.python.org/2/faq/library.html # how-do-i-get-a-single-keypress-at-time) – Matthias

11

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

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

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

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

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

+0

Использование curses намного лучше, чем довольно запутанные примеры, описанные в руководстве, даже если это связано с огромной зависимостью. +1 – Damian

37

В моем окне linux я использую следующий код. Это похоже на запись manual, упомянутую в другом месте, но этот код вращается в узком цикле, где этого кода нет, и есть много нечетных угловых случаев, когда код не учитывает этот код.

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 the character of the key that was pressed (zero 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 
    try: 
     ret = sys.stdin.read(1) # returns a single character 
    except KeyboardInterrupt: 
     ret = 0 
    finally: 
     # restore old state 
     termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save) 
     fcntl.fcntl(fd, fcntl.F_SETFL, flags_save) 
    return ret 
+0

Хотя это мой любимый ответ здесь, как и другие, не улавливает такие вещи, как shift, control и т. Д. – Mala

+0

Это, пожалуй, один из самых полезных ответов на SO. – cat

+1

@ Мала, что в чистом Python практически невозможно; возможно, вы должны написать модуль C? – cat

1

Если вы хотите увидеть, если они нажали точный ключ (как, скажем, «б») Сделайте следующее:

while True: 
    choice = raw_input("> ") 

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

Для этого пользователю нужно набрать 'b' (или что-то еще), а затем нажать enter, что сильно отличается от того, что просит OP. –

22

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

Linux:

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

Окна:

os.system("pause") 
0

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

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

Чтение документации заставляет меня думать, что это не будет тайм-аут, если вы не укажете опцию -t. –

15

Просто с помощью

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

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

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

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

Не используйте 'input' в python 2 - правильная функция' raw_input'. В python 2 'input' эквивалентен' eval (raw_input()) '. – Blorgbeard

+0

Это игнорирует все клавиши, которые пользователь нажимает, пока они не нажмут кнопку ввода, что сильно отличается от того, что задает ОП. –

+1

Кроме того, если вы собираетесь использовать «ввод», улов SyntaxError не подходит. Независимо от того, какие типы пользователей будут оцениваться, поэтому, если они, например, набирают «1/0», тогда вместо SyntaxError возникает ZeroDivisionError, и ваша программа выйдет из системы. –

-4

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

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") 
+2

Это игнорирует все клавиши, которые пользователь нажимает до тех пор, пока они не нажмут кнопку ввода, что сильно отличается от того, что просит ОП. –

+0

Это заставило меня смеяться, но никому не помогло. –

10

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

2

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

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

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

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