在Python 2中执行此操作的一种方法是使用raw_input()
:
raw_input("Press Enter to continue...")
我希望我的脚本等待用户按下任何键。
我该怎么做?
在Python 3]中使用input()
:
input("Press Enter to continue...")
在Python 2]中使用
raw_input()
:
((仅适用于Windows / DOS)msvcrt模块可让您访问Microsoft Visual C / C ++运行时库(MSVCRT)中的许多功能:]]raw_input("Press Enter to continue...")
尽管这仅等待用户按下Enter键。
一个人可能想使用msvcrt
import msvcrt as m def wait(): m.getch()
这应该等待按键。
附加信息:
在Python 3中raw_input()
不存在
在Python 2中,input(prompt)
等效于eval(raw_input(prompt))
在Python 2中执行此操作的一种方法是使用raw_input()
:
raw_input("Press Enter to continue...")
在python3中只是input()
在我的Linux机器上,我使用以下代码。这类似于我在其他地方看到的代码(例如,在旧的python FAQ中),但是该代码在一个紧密的循环中旋转,其中该代码不起作用,并且在很多奇怪的情况下,代码无法解决这个问题代码。
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)
如果可以,请根据系统命令使用以下命令:
Linux:
import os
os.system('read -sn 1 -p "Press any key to continue..."')
print
Windows:
import os
os.system("pause")
简单使用
input("Press Enter to continue...")
将导致语法错误:解析时预期的EOF。
简单修复方法:
try:
input("Press enter to continue")
except SyntaxError:
pass
python 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)
可以放入您的用例中。
我不知道与平台无关的方式,但是在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()返回所按下键的序数,以便使其具有与强制转换相同的输出。
跨平台,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
,而我不需要它。我之所以使用此代码,是因为我想阻止它。 ;)
我是python的新手,我已经认为自己太愚蠢了,无法重现这里提出的最简单的建议。事实证明,有一个陷阱应该知道:
当从IDLE执行python脚本时,某些IO命令的行为似乎完全不同(因为实际上没有终端窗口。)>
例如msvcrt.getch是非阻塞的,并且始终返回$ ff。这已经很久以前就报道过了(例如参见https://bugs.python.org/issue9290),并且已将其标记为已修复,因此该问题似乎在当前版本的python / IDLE中仍然存在。
因此,如果上面发布的任何代码都不适合您,请尝试手动运行该脚本,然后NOT from IDLE
如果要等待输入(因此用户敲击键盘不会引起意外的事情发生)
sys.stdin.readline()
[如果您想查看他们是否按下了确切的键(例如说'b'),请执行以下操作:
while True:
choice = raw_input("> ")
if choice == 'b' :
print "You win"
input("yay")
break
os.system似乎总是调用sh,后者无法识别s和n选项以进行读取。但是,可以将读取命令传递给bash:
os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")
如果要等待输入(因此用户敲击键盘不会引起意外的事情发生)
sys.stdin.readline()
[如果您想查看他们是否按下了确切的键(例如说'b'),请执行以下操作:
while True:
choice = raw_input("> ")
if choice == 'b' :
print "You win"
input("yay")
break
os.system似乎总是调用sh,后者无法识别s和n选项以进行读取。但是,可以将读取命令传递给bash:
os.system("""bash -c 'read -s -n 1 -p "Press any key to continue..."'""")
在Python 2中执行此操作的一种方法是使用raw_input()
:
raw_input("Press Enter to continue...")
在我的Linux机器上,我使用以下代码。这类似于我在其他地方看到的代码(例如,在旧的python FAQ中),但是该代码在一个紧密的循环中旋转,其中该代码不起作用,并且在很多奇怪的情况下,代码无法解决这个问题代码。
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)
如果可以,请根据系统命令使用以下命令:
Linux:
简单使用
input("Press Enter to continue...")
python 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)
我不知道与平台无关的方式,但是在Windows下,如果使用msvcrt模块,则可以使用其getch函数:
import msvcrt
c = msvcrt.getch()
print 'you entered', c
跨平台,Python 2/3代码:
我是python的新手,我已经认为自己太愚蠢了,无法重现这里提出的最简单的建议。事实证明,有一个陷阱应该知道:
当从IDLE执行python脚本时,某些IO命令的行为似乎完全不同(因为实际上没有终端窗口。)>
例如msvcrt.getch是非阻塞的,并且始终返回$ ff。这已经很久以前就报道过了(例如参见https://bugs.python.org/issue9290),并且已将其标记为已修复,因此该问题似乎在当前版本的python / IDLE中仍然存在。