为什么两个子流程会相互阻止工作?

问题描述 投票:6回答:1

我遇到了让两个子进程一起运行的问题。

第一个子流程是视频流的转码:

subprocess.Popen("ffmpeg -i input output", shell=True)

我需要在程序的后台运行,将视频从我的IP摄像机转码为mjpeg流。

第二个子进程是Openalpr守护进程,它查看mjpeg流并返回它在流中看到的汽车牌照。

 subprocess.Popen("alprd -f", shell=True)

以下是尝试运行两个子进程的python测试代码示例:

import subprocess
subprocess.Popen("ffmpeg -i input output", shell=True)
subprocess.Popen("alprd -f", shell=True)

当我这样做时,ffmpeg转码工作正常,我可以查看转码的mjpeg流,我可以在控制台中看到ffmpegs详细输出。但是,alprd守护程序似乎没有按预期返回任何数字牌照。实际上,我在控制台窗口中看不到alprd的任何输出。

如果我只使用一个子进程运行上面的代码,它可以工作,例如

import subprocess
subprocess.Popen("ffmpeg -i input output", shell=True)

工作正常,同样如下:

import subprocess
subprocess.Popen("alprd -f", shell=True)

如果我运行上面两个工作代码片段中的任何一个 - 同时在另一个Linux终端中运行另一个命令,它一切正常。

我显然不了解子流程的内容,它们之间显然是相互冲突的,但任何人都可以解释发生了什么以及如何解决问题?

谢谢!

python subprocess
1个回答
2
投票

ffmpegalprd可能都试图与相同的stdin / stdout文件句柄进行交互。要解决此问题,请为一个或两个子进程创建单独的管道以用作stdin / stdout。然后他们可以与他们互动而不会相互干扰。

import subprocess

with open('ffmpeg-output.txt', 'w') as ffmpeg_output:
    ffmpeg = subprocess.Popen(
        ['ffmpeg', '-i', 'input', 'output'],
        stdin=subprocess.PIPE,
        stdout=ffmpeg_output,
        stderr=subprocess.STDOUT)
    # We won't be sending any input into ffmpeg's stdin, so close it.
    ffmpeg.stdin.close()

    # alprd inherits stdin, stdout, and stderr from the current process.
    alprd = subprocess.Popen(['alprd', '-f'])

    # Wait for the subprocesses to finish.
    ffmpeg.wait()
    alprd.wait()
© www.soinside.com 2019 - 2024. All rights reserved.