一段时间后,Python尾文件或命名管道停顿了

时间:2018-07-24 08:21:43

标签: python linux pipe

我有一个GNU广播项目,它从运行在树莓派上的FM扫描仪输出数据。我还运行了一个蓝牙服务,该服务应该将gnu radio命令输出到stdout的所有数据发送到任何接收器。蓝牙部分工作正常。

要从stdout收集数据并将其发送到python蓝牙脚本,我想我会使用命名管道。我以以下方式运行它:

sudo ais_rx --gain 44 --error 5 -s osmocom 2>&1 | sudo tee> /tmp/namedpipe

这应该将两个stdout和stderr都发送到tmp文件夹中的管道,该管道是在python端创建的,如下所示:

pipe_path = "/tmp/namedpipe"
if not os.path.exists(pipe_path):
    os.mkfifo(pipe_path)

然后我像这样循环读取和打印所有数据:

with open(pipe_path) as fifo:
    print("FIFO opened")
    while True:
        try:               
            data = fifo.readline()
            print(data)
        except Error:
            print ('error')

这可以正常工作一分钟左右,然后似乎停滞不前。没有错误,它只是停止响应写入管道的内容。

要排除管道的任何问题,我还尝试写入文件并拖尾,如下所示:

sudo ais_rx --gain 44 --error 5 -s osmocom 2>&1 | sudo tee> /tmp/namedfile

然后我将其尾随如下:

f = subprocess.Popen(['tail','-F','/tmp/namedfile'],\
stdout=subprocess.PIPE,stderr=subprocess.PIPE)
p = select.poll()
p.register(f.stdout)

while True:
    if p.poll(1):
        try:               
            data = f.stdout.readline().strip()            
            print(data)
        except Error:
            print ('error')
    time.sleep(1)

我知道数据输出实际上并不会停止,因为如果我从终端拖尾它,我可以看到它进入。只是python端停止读取它。

有人能指出我正确的方向吗?

0 个答案:

没有答案