你的例子会循环,因为之后echo test1
stdin已关闭并且read()
总是返回空。
另外你不应该使用另一个阻塞调用select
。如果你愿意
在多个对象上使用它,您仍然可能被阻止readline
从上一个事件。
用于一次读取一行stdin你不需要使用select.select()
。可能是实现这一目标的最简单方法:
for line in sys.stdin:
print(line)
如果你想使用stdin
或作为参数的文件列表
你的程序,Python的fileinput https://docs.python.org/3/library/fileinput.html模块
是开箱即用的解决方案。
如果您想要/需要使用select.select()
无论如何:
import os, sys, select
buffer = ""
while True:
select.select([sys.stdin.fileno()], [], [])
read = os.read(sys.stdin.fileno(), 512)
# empty read: EOF
if len(read) == 0:
# buffer might not be empty
if len(buffer) > 0:
sys.stdout.write(buffer + "\n")
break
# find newlines
parts = read.split("\n")
buffer += parts.pop(0)
while len(parts) > 0:
sys.stdout.write(buffer + "\n")
buffer = parts.pop(0)
当一个对象准备好时,select.select https://docs.python.org/3/library/select.html#select.select解锁。本例中唯一的对象是stdin。与不止一个
您需要检查的返回值的对象select.select
找出来
哪一个已经准备好了。os.read()
用于进行非阻塞读取stdin(或者:
可以使用stdin.read(1)
一次读取一个字符)。read.split("\n")
用于查找换行符,请注意它是
一次读取可能会产生不止一行。