在while(True)循环中,Python sys.stdin.read(1) 一次成功获取输入,后续多次未获取输入

1 投票
2 回答
21494 浏览
提问于 2025-04-17 19:25

我在64位的Windows 7上运行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在无限循环中每次读取一个字符?

2 个回答

2

sys.stdin 默认是按行缓存的,也就是说,当你使用 sys.stdin.read(1) 时,它不会返回结果,直到输入的内容形成了一整行。

这意味着,如果你输入一个字符并按下 Enter,那么在你用 sys.stdin.read(1) 获取第一个字符后,缓冲区里会有一个换行符(可能是一个或两个字符:os.linesep),这些换行符会在下一次循环时立刻被读取。

如果你想避免按 Enter,可以通过一次读取一个字符的方式来实现(使用 msvcrt.getch())。

3

这个问题可能是因为标准输入被清空了,而换行符\n还留在那里。

作为一个替代方案,可以使用raw_input

while True:
    c = raw_input('please enter a character: ')
    print 'you entered', c

关于清空输入部分,可以查看这个链接

撰写回答