【问题标题】:Python: simultaneous use of os.fork(), os.pipe() and subprocess.Popen issuePython:同时使用 os.fork()、os.pipe() 和 subprocess.Popen 问题
【发布时间】:2019-02-28 15:42:18
【问题描述】:

基本上,我有以下代码段

#!/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 是好还是坏?我只是不确定是否有人会这样做还是有更好的选择?您的帮助将不胜感激:)

【问题讨论】:

    标签: python python-3.x pipe fork


    【解决方案1】:

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

    【讨论】:

    • Erm...这不起作用...我知道管道正在流式传输,但我想知道r文件描述符是否正在读取subprocess'管道而不是通过@创建的管道987654326@ 无论如何感谢您的帮助 :)
    猜你喜欢
    • 2018-09-12
    • 2010-12-27
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    相关资源
    最近更新 更多