基本上,我有以下代码段
#!/usr/bin/env python3
import os
import sys
import subprocess
import time
import shlex
import paho.mqtt.client as paho
if __name__ == "__main__":
r, w = os.pipe()
processId = os.fork()
if processId:
# wait to ensure tshark is started appropriately
os.close(w)
r = os.fdopen(r,'r')
while True:
str = r.read()
print("{} {}".format("Message from child: ",str))
if str == "ok":
break
print("Parent exit")
else:
os.close(r)
w = os.fdopen(w,'w')
cmd = "tshark | grep EAP"
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, shell=True, universal_newlines=True)
w.write("ok")
# send signal to parent stating tshark has started appropriately
for output in iter(process.stdout.readline, ""):
pass #if contains EAP packet, do something
我正在尝试创建一个子进程,该进程通过捕获的数据包立即通过tshark
捕获数据包以执行某些操作。我试图分叉一个进程,以便对于父进程可以执行一些操作,而子进程可以捕获数据包。我还想先确保孩子在父进程继续工作之前已经成功启动tshark
。
1)subprocess.Popen
的管道是否干扰从os.pipe()
创建的管道?
我当时以为这两个管道是两个截然不同的管道,所以两者互不干扰。但是,我注意到父进程无法通过读取管道接收消息,并且仅当subprocess
具有某些输出时,父进程才会接收消息。我在这里需要帮助...
2)是否有任何方法可以基于行捕获subprocess
的输出?我已阅读this的建议,可以在subprocess
仍在运行时捕获输出,但是只有在达到缓冲区大小时它才返回输出。
3)同时混合os.pipe()
,os.fork()
和subprocess.Popen
是好方法还是坏方法?我只是不确定是否有人会这样做,或者还有更好的选择吗?非常感谢您的帮助:)
答案 0 :(得分:0)
您的str = r.read()
将要读取直到管道关闭。管道正在流式传输,而不是数据报。也许使用.readline()
和w.write("ok\n")
,以便知道何时停止读取数据并返回?