如何使用 python 来控制多个并发的命令行程序?

How can I use python to control multiple concurrant command line programs?

我想使用 python 程序将不同的视频发送到不同的设备。

我的计划是使用 ffmpeg 来控制视频和目标(我可以使用 os.system 对一个目标执行此操作)但我不确定如何编写并发 ffmpeg 命令以便 6 个视频在不同设备上同时播放。

最初我以为我可以使用 tmux,但我找不到如何在我的 python 程序中 control/access 不同的 tmux windows 的解决方案。我是否漏掉了一些明显的东西?

您可以为此使用 python 子流程模块:https://docs.python.org/3/library/subprocess.html

作为一个简单的例子,我将 运行 一个 Linux 实用程序 'sleep' 除了等待给定的秒数之外什么都不做。我将并行执行此操作,以了解我们是否真的可以并行执行子流程。作为第一个设置,我这样做:

import os
import subprocess
import time

n_jobs = 5
sleeping_time_in_sec = 10
shell_command_with_arguments = ["sleep", f"{sleeping_time_in_sec}s"]

我正在导入 'subprocess' 以并行启动作业。我将使用“时间”模块来测量总 运行ning 时间。我将使用 'os' 模块来阻止脚本,直到完成所有作业。 shell 命令看起来像 'sleep 10s',但是对于子进程,您将脚本和所有参数放在一个列表中。

像这样提交作业:

time_start = time.time()
jobs = list()
for counter in range(n_jobs):
    process = subprocess.Popen(shell_command_with_arguments, shell=False)
    jobs.append(process)

现在所有耗时 10 秒的 5 个作业都已提交。为了让你的脚本等到最后一个过程完成,你可以添加:

print(f"Waiting for all {n_jobs} processes to finish...")
for ip, process in enumerate(jobs):
    try:
        os.waitpid(process.pid, 0)
    except ChildProcessError:
        print(f"No more: {ip} : {process.pid}")
    else:
        print(f"DONE: {ip} : {process.pid}")

最后,我报总运行ning时间:

time_end = time.time()
delta_time = time_end - time_start
print(f"Run {n_jobs} jobs taking {sleeping_time_in_sec} s each in {delta_time} s")

脚本的输出如下:

Waiting for all 5 processes to finish...
DONE: 0 : 88988
DONE: 1 : 88989
DONE: 2 : 88990
DONE: 3 : 88991
DONE: 4 : 88992
Finished running 5 jobs each taking 10 s in 10.022365093231201 s

如你所见,如果你运行系列中的睡眠命令5次,则需要50秒。但是由于脚本花费的时间比 10 秒多一点,您可以看到作业确实是 运行ning 并行的。