让两个子进程一起运行时遇到问题。
第一个子过程是视频流的转码:
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终端中运行另一个命令,则一切正常。
我显然不了解子流程,它们显然相互冲突,但是谁能解释正在发生的事情以及如何解决问题?
谢谢!
答案 0 :(得分:2)
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()