繁体   English   中英

python脚本之间的管道

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM