您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python读取名为PIPE

Python读取名为PIPE

以典型的UNIX方式,read(2)返回0字节以指示文件结束,这可能意味着:

在您的情况下,fifo.read()正在返回一个空字符串,因为编写器已关闭文件描述符。

您应该检测到这种情况并打破循环:

import os
import errno

FIFO = 'mypipe'

try:
    os.mkfifo(FIFO)
except OSError as oe: 
    if oe.errno != errno.EEXIST:
        raise

print("opening FIFO...")
with open(FIFO) as fifo:
    print("FIFO opened")
    while True:
        data = fifo.read()
        if len(data) == 0:
            print("Writer closed")
            break
        print('Read: "{0}"'.format(data))

1号航站楼

$ python reader.py 
opening FIFO...
<blocks>

2号航站楼

$ echo -n 'hello' > mypipe

1号航站楼

FIFO opened
Read: "hello"
Writer closed
$

您指出您想继续监听管道上的写入,即使在关闭写入器之后也是如此。

为了有效地做到这一点,您可以(并且应该)利用以下事实:

通常,打开FIFO块,直到另一端也打开。

在这里,我周围添加一个循环openread循环。这样,一旦管道关闭代码将尝试重新打开它,直到其他编写者打开管道为止,该代码将阻塞:

import os
import errno

FIFO = 'mypipe'

try:
    os.mkfifo(FIFO)
except OSError as oe:
    if oe.errno != errno.EEXIST:
        raise

while True:
    print("opening FIFO...")
    with open(FIFO) as fifo:
        print("FIFO opened")
        while True:
            data = fifo.read()
            if len(data) == 0:
                print("Writer closed")
                break
            print('Read: "{0}"'.format(data))

1号航站楼

$ python reader.py 
opening FIFO...
<blocks>

2号航站楼

$ echo -n 'hello' > mypipe

1号航站楼

FIFO opened
Read: "hello"
Writer closed
opening FIFO...
<blocks>

2号航站楼

$ echo -n 'hello' > mypipe

1号航站楼

FIFO opened
Read: "hello"
Writer closed
opening FIFO...
<blocks>

… 等等。

您可以通过阅读man有关管道的页面来了解更多信息:

python 2022/1/1 18:18:37 有377人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶