繁体   English   中英

Python:同时使用os.fork(),os.pipe()和subprocess.Popen问题

[英]Python: simultaneous use of os.fork(), os.pipe() and subprocess.Popen issue

基本上,我有以下代码段

#!/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的输出? 我已经读过这条建议,可以在subprocess仍在运行时捕获输出,但是只有在达到缓冲区大小时它才返回输出。

3)它是一种用于混合好坏的方法os.pipe() os.fork()subprocess.Popen一下子? 我只是不确定是否有人会这样做,或者还有更好的选择吗? 非常感谢您的帮助:)

您的str = r.read()将读取直到管道关闭。 管道正在流式传输,而不是数据报。 也许使用.readline()w.write("ok\\n") ,以便它知道何时停止读取数据并返回?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM