Python sys.stdin.read(1)在while(True)循环中一致地执行一次获取输入和多次不获取输入
我正在64位Windows7上运行python 2.7 以下是我正在执行的代码:Python sys.stdin.read(1)在while(True)循环中一致地执行一次获取输入和多次不获取输入,python,python-2.7,Python,Python 2.7,我正在64位Windows7上运行python 2.7 以下是我正在执行的代码: import sys while True: print 'please enter a character:' c = sys.stdin.read(1) print 'you entered', str(c) 在eclipse中的PyDev环境中,我得到以下输入a和b的输出 please enter a character: a you entered a please enter a
import sys
while True:
print 'please enter a character:'
c = sys.stdin.read(1)
print 'you entered', str(c)
在eclipse中的PyDev环境中,我得到以下输入a和b的输出
please enter a character:
a
you entered a
please enter a character:
you entered
please enter a character:
you entered
please enter a character:
b
you entered b
please enter a character:
you entered
please enter a character:
you entered
please enter a character:
它正确地获取一次输入,然后执行两次跳过用户输入
现在,当我在python终端中为输入a和b运行相同的代码时,我得到以下输出:
enter char
a
you entered a
enter char
you entered
enter char
b
you entered b
enter char
you entered
enter char
它执行一次获取用户输入和一次跳过用户输入
是什么导致了这个问题?如何让Python在一个无限循环中一次读取一个字符?问题可能是由于stdin的刷新,因为
\n
仍然存在
作为替代方案,使用
有关冲洗部分,请参见问题可能是由于冲洗标准DIN造成的,因为
\n
持续存在
作为替代方案,使用
对于刷新部分,请参见默认情况下,系统stdin是行缓冲的,即在stdin缓冲区中有完整的行之前,
sys.stdin.read(1)
不会返回
这意味着,如果您输入一个字符并按enter键,那么在使用sys.stdin.read(1)
获得第一个字符后,缓冲区中会有一个换行符(一个或两个字符:os.linesep
),在下一次循环迭代中会立即读取
您可以避免按Enter键(
msvcrt.getch()
)。sys.stdin
在默认情况下是行缓冲的,即您的sys.stdin.read(1)
在stdin缓冲区中有完整的行之前不会返回
这意味着,如果您输入一个字符并按enter键,那么在使用sys.stdin.read(1)
获得第一个字符后,缓冲区中会有一个换行符(一个或两个字符:os.linesep
),在下一次循环迭代中会立即读取
您可以避免按Enter键(
msvcrt.getch()
)。阅读后,可以尝试使用sys.stdin.flush()
。。。梅贝撒谎了。在PyDev中,Eclipse调用flush()会导致1次获取用户输入,1次跳过用户输入(而不是2次)。添加多个flush()没有其他效果。请在阅读以下内容后尝试sys.stdin.flush()
。。。梅贝撒谎了。在PyDev中,Eclipse调用flush()会导致1次获取用户输入,1次跳过用户输入(而不是2次)。添加多个flush()没有其他效果。经过更多测试后,我发现“\r\n”在缓冲区中挥之不去。因此,在循环的下一次迭代中,'\r'立即从read(1)返回,在下一次迭代中,'\n'立即从read(1)返回。调用flush()只会删除'\r',但'\n'仍然存在。经过更多测试,我发现'\r\n'在缓冲区中仍然存在。因此,在循环的下一次迭代中,'\r'立即从read(1)返回,在下一次迭代中,'\n'立即从read(1)返回。调用flush()只会删除'\r',但'\n'仍然存在。
while True:
c = raw_input('please enter a character: ')
print 'you entered', c