我遇到了让两个子进程一起运行的问题。
第一个子流程是视频流的转码:
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终端中运行另一个命令,它一切正常。
我显然不了解子流程的内容,它们之间显然是相互冲突的,但任何人都可以解释发生了什么以及如何解决问题?
谢谢!
ffmpeg
和alprd
可能都试图与相同的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()