我正在尝试使用Python脚本逐个字符地读取标准输入,只要有可用内容就会通知select.select()
。我面对的是一种我不理解的行为;它可能最好用一个例子来说明。首先,这是一个示例选择代码:
import select
import sys
while True:
r, w, e = select.select([sys.stdin], [], [])
print "Read: %s" % sys.stdin.read(1)
现在这是脚本的示例运行:
/tmp$ python test.py
AAAA # I type in a few chars then ENTER.
Read: A # Only one char is detected :(
BBBB # I type in more characters
Read: A # Now all the previous characters are detected!?
Read: A
Read: A
Read: # ('\n' is read which I want)
Read: B # Wait, where are the other Bs?
CCCC # I need to type more chars so that BBB is printed, and the first C.
如上所示,如果在stdin
中输入了多个字符,则只打印第一个字符。然后,如果添加了更多字符,则会打印上一个输入中的所有剩余字符以及新输入中的第一个字符。
我做错了什么?
答案 0 :(得分:1)
select.select
不知道Python文件对象(例如sys.stdin
)中的缓冲。您可以完全绕过文件对象,但这会与尝试从sys.stdin
:
import select
import os
import sys
while True:
r, w, e = select.select([sys.stdin], [], [])
print os.read(sys.stdin.fileno(), 1)