[英]Pipe between python scripts
我有一个简单的脚本,它从设备读取值并通过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
这是最终结果。 第一个脚本从设备读取,第二个脚本在两个单独的时间帧中绘制数据(显示的是随机数)。
啊,现在这是一个棘手的问题。 这是因为sys.stdin
的迭代器方法(它是xreadlines()
)被缓冲了。 换句话说,当你的循环隐式调用next(sys.stdin)
来获取下一行输入时, Python会尝试从真正的next(sys.stdin)
标准输入流中读取 ,直到其内部缓冲区已满,并且只有缓冲区一次它是否已经通过循环体进行。 缓冲区大小为8千字节 ,因此需要一段时间。
您可以通过将sleep()
调用中的时间延迟减少到0.001
或某些此类值来查看此信息,具体取决于系统的功能。 如果你恰到好处的时间,你几秒钟就看不到任何东西,然后一整块42
秒就会出现。
要修复它,请使用sys.stdin.readline()
缓冲的sys.stdin.readline()
。
while True:
line = sys.stdin.readline()
print line
您可能还想在打印前删除尾随换行符,否则您将获得双换行符。 使用line.rstrip('\\n')
或仅print line,
来抑制print line,
的额外换行符。
我改变了你的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
42
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.