По сути, у меня есть следующий сегмент кода
#!/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
одновременно?Я просто не уверен, будет ли кто-то делать это или есть какие-то лучшие альтернативы?Ваша помощь будет высоко оценена :)