在Python 3.x中,您可能必须直接从sys.stdin.buffer而不是sys.stdin中读取,然后手动解码为Unicode。所以:
import sys, termios, tty assert sys.stdin.isatty(), "Can't run without a console to run on" fd = sys.stdin.fileno() stash = termios.tcgetattr(fd) try: tty.setraw(fd) newterm = termios.tcgetattr(fd) newterm[tty.LFLAG] |= termios.ECHO termios.tcsetattr(fd) message = b'' while True: ch = sys.stdin.buffer.read(1) if ch == b'\x1b'exit(0) elif ch == b'\n'break else:message += ch message = message.decode(sys.stdin.encoding) finally: termios.tcsetattr(fd, termios.TCSANOW, stash)
与Windows版本,这应该是2.6 +/3.3 +多版本兼容,除了一个事实,即它总是返回unicode而2.Xraw_input将返回str(在此大小写全部在decode行中,如果不需要,可以放弃)。
请注意,我在这里同时使用了tty和termios。tty模块是一个更高级别的包装,但它不会做你想做的一切。因此,您可以尽可能使用它(翻转需要的任何开关以在您的平台上获取原始模式,并让您为标记集和值使用跨平台/可读名称而不是索引),但通常无论如何还是需要termios。
在任何其他平台上,你是自己的。