簡體   English   中英

如何使用 python 控制多個並發命令行程序?

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

我想使用 python 程序將不同的視頻發送到不同的設備。

我的計划是使用 ffmpeg 來控制視頻和目標(我可以使用 os.system 為一個目標執行此操作)但我不確定如何編寫並發 ffmpeg 命令以便 6 個視頻同時在不同的播放設備。

最初我以為我可以使用 tmux 但我找不到如何在我的 python 程序中控制/訪問不同的 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"]

我正在導入“子流程”以並行啟動作業。 我將使用“時間”模塊來測量總運行時間。 在完成所有作業之前,我將使用“os”模塊來阻止腳本。 shell 命令看起來像“sleep 10s”,但對於子進程,您將腳本和所有 arguments 放在一個列表中。

像這樣提交作業:

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

現在所有 5 個作業都已提交,每個作業耗時 10 秒。 為了讓你的腳本等到最后一個過程完成,你可以添加:

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")

腳本的 output 如下所示:

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 秒多一點,您可以看到作業確實是並行運行的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM