我有一个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端停止读取它。
有人能指出我正确的方向吗?