Как использовать subprocess.popen для выполнения нескольких программ, которые хранятся в списке

я хотел спросить, как я могу использовать subprocess.popen для одновременного выполнения нескольких программ в python, если имена исполняемой программы хранятся в списке. я просто не могу придумать, как мы можем это сделать

Какие программы? Нужно ли выполнять программы с аргументами? А что вы пробовали? В чем конкретно вам нужна помощь?

Carcigenicate 23.12.2020 15:33

нормальные программы python без каких-либо аргументов. Я пытался использовать цикл for, но он выполняется последовательно

Rahul Singh 23.12.2020 15:40

Вы можете использовать multithreading для создания потоков, а затем запускать подпроцессы в каждом потоке. Зачем запускать программы на Python, используя popen? Почему бы просто не импортировать их и не использовать как любой другой код?

Carcigenicate 23.12.2020 16:09

я действительно хотел попытаться создать несколько контейнеров докеров одновременно, используя его. @Carcigenicate, не могли бы вы объяснить, что вы подразумеваете под использованием многопоточности через код, если это возможно?

Rahul Singh 23.12.2020 16:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Трудно дать конкретный ответ, так как неясно, что именно вы хотите запустить (а у меня нет большого опыта работы с докером). Вот пример запуска нескольких ping одновременно, который должен проиллюстрировать, как это можно сделать:

from subprocess import Popen
from multiprocessing.pool import ThreadPool

programs = ["ping 192.168.50.111", "ping 192.168.50.102"]

def run_program(prog_string):
    return Popen(prog_string.split())

# A bit of an abuse of ThreadPool, but it makes cleaning up the threads easier.
with ThreadPool(len(programs)) as pool:
    popens = pool.map(run_program, programs)

В моей сети это печатает:

Pinging 192.168.50.111 with 32 bytes of data:
Pinging 192.168.50.102 with 32 bytes of data:
Reply from 192.168.50.102: bytes=32 time=21ms TTL=64
Reply from 192.168.50.111: bytes=32 time=342ms TTL=64
Reply from 192.168.50.102: bytes=32 time=3ms TTL=64
Reply from 192.168.50.111: bytes=32 time=991ms TTL=64
Reply from 192.168.50.111: bytes=32 time=5ms TTL=64
Reply from 192.168.50.102: bytes=32 time=2ms TTL=64
Reply from 192.168.50.102: bytes=32 time=2ms TTL=64
Ping statistics for 192.168.50.102:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 2ms, Maximum = 21ms, Average = 7ms
Reply from 192.168.50.111: bytes=32 time=812ms TTL=64
Ping statistics for 192.168.50.111:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 5ms, Maximum = 991ms, Average = 537ms

Как видите, оба были запущены примерно в одно и то же время и работают одновременно.

ThreadPool создает пул потоков и запускается run_program внутри потоков. «Программные строки» programs передаются этой функции по отдельности, затем возвращается результирующий Popen, и все они вместе помещаются в popens.

Если вам действительно не нужно Popen, вы можете обнаружить, что run проще в использовании.

Другие вопросы по теме