Python sys.stdin.read(1)在while(True)循环中一致地执行一次获取输入和多次不获取输入

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

我正在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 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