我有一个简单的脚本,它从设备中读取值并通过print输出,还有另一个脚本,它监听stdin并解释每个数字。该设备每秒钟输出一个数字。令人惊讶的是,在我的ubuntu盒上传输脚本不起作用。但是,如果第一个脚本不是从设备读取,而是尽可能快地生成随机数,则第二个脚本成功地接收到数据。
下面是我的情况的一个简单例子。
print.py:
#!/usr/bin/env python2
import time
import sys
while True:
time.sleep(1) # without this everything works
print "42"
sys.stdout.flush()read.py:
#!/usr/bin/env python2
import sys
while True:
for str in sys.stdin:
print str命令行调用:
vorac@laptop:~/test$ ./print.py | ./read.py这是最终结果。第一个脚本从设备中读取数据,第二个脚本在两个不同的时间框架内绘制数据(所显示的是随机数)。

发布于 2015-11-09 12:10:37
啊,这是个棘手的问题。之所以发生这种情况,是因为sys.stdin (即xreadlines())的迭代器方法被缓冲。换句话说,当您的循环隐式调用next(sys.stdin)以获取下一行输入时,Python试图读取从真正的底层标准输入流一直到其内部缓冲区已满为止,并且只有当缓冲区满时,它才能通过循环的主体。缓冲区大小为8千字节。,所以这需要一段时间。
您可以通过减少sleep()调用0.001的时间延迟或类似的值来看到这一点,这取决于您的系统的功能。如果您正好赶上时间,那么几秒钟内您将什么也看不到,然后一整块42就会同时出现。
要修复它,请使用sys.stdin.readline(),它是非缓冲的。
while True:
line = sys.stdin.readline()
print line在打印前,您可能还需要去掉尾随换行符,否则会得到双行中断。使用line.rstrip('\n'),或仅使用print line,来抑制打印的额外换行符。
发布于 2015-11-09 12:09:49
我更改了您的read.py,它对我起了作用:),您忘记了从stdin转到.readline()。
import sys
while True:
line = sys.stdin.readline()
if line:
print line.strip()
else:
continue产出如下:
$ python write.py | python read.py
42
42
42
42
42
42
42https://stackoverflow.com/questions/33608344
复制相似问题