为什么两个子流程会彼此停止工作?

时间:2019-03-01 15:06:49

标签: python subprocess

让两个子进程一起运行时遇到问题。

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

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终端中运行另一个命令,则一切正常。

我显然不了解子流程,它们显然相互冲突,但是谁能解释正在发生的事情以及如何解决问题?

谢谢!

1 个答案:

答案 0 :(得分: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()