首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python脚本之间的管道

python脚本之间的管道
EN

Stack Overflow用户
提问于 2015-11-09 11:42:00
回答 2查看 3K关注 0票数 4

我有一个简单的脚本,它从设备中读取值并通过print输出,还有另一个脚本,它监听stdin并解释每个数字。该设备每秒钟输出一个数字。令人惊讶的是,在我的ubuntu盒上传输脚本不起作用。但是,如果第一个脚本不是从设备读取,而是尽可能快地生成随机数,则第二个脚本成功地接收到数据。

下面是我的情况的一个简单例子。

print.py:

代码语言:javascript
运行
复制
#!/usr/bin/env python2
import time
import sys

while True:
    time.sleep(1)  # without this everything works
    print "42"
    sys.stdout.flush()

read.py:

代码语言:javascript
运行
复制
#!/usr/bin/env python2
import sys

while True:
    for str in sys.stdin:
        print str

命令行调用:

代码语言:javascript
运行
复制
vorac@laptop:~/test$ ./print.py | ./read.py

这是最终结果。第一个脚本从设备中读取数据,第二个脚本在两个不同的时间框架内绘制数据(所显示的是随机数)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-09 12:10:37

啊,这是个棘手的问题。之所以发生这种情况,是因为sys.stdin (即xreadlines())的迭代器方法被缓冲。换句话说,当您的循环隐式调用next(sys.stdin)以获取下一行输入时,Python试图读取从真正的底层标准输入流一直到其内部缓冲区已满为止,并且只有当缓冲区满时,它才能通过循环的主体。缓冲区大小为8千字节。,所以这需要一段时间。

您可以通过减少sleep()调用0.001的时间延迟或类似的值来看到这一点,这取决于您的系统的功能。如果您正好赶上时间,那么几秒钟内您将什么也看不到,然后一整块42就会同时出现。

要修复它,请使用sys.stdin.readline(),它是非缓冲的。

代码语言:javascript
运行
复制
while True:
    line = sys.stdin.readline()
    print line

在打印前,您可能还需要去掉尾随换行符,否则会得到双行中断。使用line.rstrip('\n'),或仅使用print line,来抑制打印的额外换行符。

票数 3
EN

Stack Overflow用户

发布于 2015-11-09 12:09:49

我更改了您的read.py,它对我起了作用:),您忘记了从stdin转到.readline()

代码语言:javascript
运行
复制
import sys
while True:
    line = sys.stdin.readline()
    if line:
        print line.strip()
    else:
        continue

产出如下:

代码语言:javascript
运行
复制
$ python write.py | python read.py 
42
42
42
42
42
42
42
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33608344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档