11 ответов:
в Python 3, нет . Так что, просто используйте:
input("Press Enter to continue...")Это только ждет пользователя, чтобы нажать enter, хотя, так что вы можете использовать библиотекой ((только для Windows/DOS) модуль msvcrt предоставляет вам доступ к ряду функций в библиотеке времени выполнения Microsoft Visual C / C++ (MSVCRT)):
import msvcrt as m def wait(): m.getch()Это должно ждать нажатия клавиши.
один из способов сделать это в Python 2, это использовать
raw_input():raw_input("Press Enter to continue...")в python3 это просто
input()
на моем linux box, я использую следующий код. Это похоже на руководство запись упоминается в другом месте, но этот код вращается в узком цикле, где этот код не делает, и есть много нечетных угловых случаев, которые код не учитывает, что этот код делает.
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 = '\x03' finally: # restore old state termios.tcsetattr(fd, termios.TCSAFLUSH, attrs_save) fcntl.fcntl(fd, fcntl.F_SETFL, flags_save) return ret
Если вы в порядке с в зависимости от системных команд вы можете использовать следующее:
Linux:
os.system('read -s -n 1 -p "Press any key to continue..."') printWindows:
os.system("pause")
просто используя
input("Press Enter to continue...")вызывает синтаксис ошибка: ожидается ВФ при синтаксическом анализе.
простое использование исправления:
try: input("Press enter to continue") except SyntaxError: pass
питон руководство предусматривает следующее:
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)который может быть свернут в вашем случае использования.
Я не знаю независимого от платформы способа сделать это, но под Windows, Если вы используете модуль msvcrt, вы можете использовать его функцию getch:
import msvcrt c = msvcrt.getch() print 'you entered', cmscvcrt также включает неблокирующую функцию kbhit (), чтобы увидеть, была ли нажата клавиша без ожидания (не уверен, есть ли соответствующая функция проклятий). В UNIX есть пакет curses, но не уверен, что вы можете использовать его, не используя его для всего вывода на экран. Этот код работает под UNIX:
import curses stdscr = curses.initscr() c = stdscr.getch() print 'you entered', chr(c) curses.endwin()обратите внимание, что проклятия.getch () возвращает порядковый номер клавиши, нажатой таким образом, чтобы он имел тот же выход, который я должен был бросить.
кросс-платформенный, 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 / неблокирующий материал, потому что он давал
IOErrors и мне это не нужно. Я использую этот код специально, потому что я хочу его заблокировать. ;)
Я новичок в python, и я уже думал, что я слишком глуп, чтобы воспроизвести самые простые предложения, сделанные здесь. Оказывается, есть ловушка, которую нужно знать:
когда python-скрипт выполняется из режима ожидания, некоторые IO-команды, похоже, ведут себя совершенно по-другому (поскольку на самом деле нет окна терминала).
например. msvcrt.getch не блокируется и всегда возвращает $ff. Об этом уже давно сообщалось (см. например https://bugs.python.org/issue9290) - и он помечен как фиксированный, каким-то образом проблема, похоже, сохраняется в текущих версиях python/IDLE.
Так что если код размещен выше не работает для вас, попробуйте запустить скрипт вручную, а не от простоя.
Если вы хотите увидеть, если они нажали точную клавишу (например, сказать 'b') Сделать это:
while True: choice = raw_input("> ") if choice == 'b' : print "You win" input("yay") break
ОС.система, похоже, всегда вызывает sh, который не распознает параметры s и n для чтения. Однако команда read может быть передана в bash:
os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")
Comments