Python 子进程 (ffmpeg) 仅在我按 Ctrl-C 程序时启动?
Python subprocesses (ffmpeg) only start once I Ctrl-C the program?
我正在尝试使用 Cygwin 和 Python 2.7.运行 并行执行一些 ffmpeg 命令。
我大概是这样的:
import subprocess
processes = set()
commands = ["ffmpeg -i input.mp4 output.avi", "ffmpeg -i input2.mp4 output2.avi"]
for cmd in commands:
processes.add(
subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
)
for process in processes:
if process.poll() is None:
process.wait()
现在,一旦我到达这段代码的末尾,整个程序就会等待。所有 ffmpeg 进程都已创建,但它们处于空闲状态,即使用 0% CPU。 Python 程序一直在等待。只有当我按下 Ctrl-C 时,它突然开始编码。
我做错了什么?我是否必须 "send" 启动它们的进程?
这只是一个猜测,但 ffmpeg
通常会在 stderr 或 stdout 上产生大量状态消息和输出。您正在使用 subprocess.PIPE
将 stdout 和 stderr 重定向到管道,但您从未从中读取过这些内容,因此如果管道缓冲区已满,ffmpeg 进程将在尝试向其写入数据时阻塞。
当你杀死父进程时,管道在其末端关闭,并且可能(我没有检查过)ffmpeg 通过不再写入管道来处理错误,因此解除阻塞并开始工作。
因此,要么使用父进程中的 process.stdout
和 process.stderr
管道,要么 redirect the output to os.devnull
如果您不关心它。
除了 所说的,ffmpeg 可能还会询问您是否要覆盖 output.avi 并等待您输入 "y"。要强制覆盖,请使用“-y”命令行选项 (ffmpeg -i $input -y $output
)。
我正在尝试使用 Cygwin 和 Python 2.7.运行 并行执行一些 ffmpeg 命令。
我大概是这样的:
import subprocess
processes = set()
commands = ["ffmpeg -i input.mp4 output.avi", "ffmpeg -i input2.mp4 output2.avi"]
for cmd in commands:
processes.add(
subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
)
for process in processes:
if process.poll() is None:
process.wait()
现在,一旦我到达这段代码的末尾,整个程序就会等待。所有 ffmpeg 进程都已创建,但它们处于空闲状态,即使用 0% CPU。 Python 程序一直在等待。只有当我按下 Ctrl-C 时,它突然开始编码。
我做错了什么?我是否必须 "send" 启动它们的进程?
这只是一个猜测,但 ffmpeg
通常会在 stderr 或 stdout 上产生大量状态消息和输出。您正在使用 subprocess.PIPE
将 stdout 和 stderr 重定向到管道,但您从未从中读取过这些内容,因此如果管道缓冲区已满,ffmpeg 进程将在尝试向其写入数据时阻塞。
当你杀死父进程时,管道在其末端关闭,并且可能(我没有检查过)ffmpeg 通过不再写入管道来处理错误,因此解除阻塞并开始工作。
因此,要么使用父进程中的 process.stdout
和 process.stderr
管道,要么 redirect the output to os.devnull
如果您不关心它。
除了 ffmpeg -i $input -y $output
)。