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



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

我的计划是使用ffmpeg来控制视频和目的地(我可以使用os.system为一个目的地这样做(,但我不知道如何编写并发的ffmpeg命令,以便在不同的设备上同时播放6个视频。

起初我认为我可以使用tmux,但我找不到如何在python程序中控制/访问不同tmux窗口的解决方案。我是不是错过了一些显而易见的东西?

您可以使用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"]

我正在导入"子流程"以并行启动作业。我将使用"时间"模块来测量总运行时间。我将使用"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}")

最后,我报告了总运行时间:

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

正如你所看到的,如果你连续运行sleep命令5次,需要50秒。但由于脚本需要10秒多一点的时间,你可以看到这些作业确实是并行运行的。

最新更新