Python: Как запустить несколько файлов одновременно? - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь создать цикл For, который автоматически запускает разные файлы Python в одно и то же время, но кажется, что они всегда запускаются один за другим.

import os
import multiprocessing
import p1, p2, p3

#first idea

path = "C:" + "\\Users\\Max\\\\Desktop\\\python\\tasks\\"
tasks = ['p1.py', 'p2.py', 'p3.py']
len = tasks.__len__()
ind = 0
for i in range(len):
    os.system('python' + ' ' + tasks[ind])
    ind += 1

#second idea

for x in ('p1', 'p2', 'p3'):
    p = multiprocessing.Process(target=lambda: __import__(x))
    p.start()

p1, p2, p3файлы, которые я пытаюсь запустить одновременно, но они выполняются один за другим, поэтому, если код:

time.sleep(10)
print("hello)

, мне придется подождать 30 секунд, чтобы программа была выполнена,вместо 10 секунд, которые я хочу.

Ответы [ 3 ]

2 голосов
/ 02 апреля 2019

Если вы хотите запустить файлы в трех отдельных интерпретаторах, запустите их как подпроцессы:

import subprocess
path = r"C:\Users\Max\Desktop\python\tasks"
tasks = ['1.py', '2.py', '3.py']
task_processes = [
    subprocess.Popen(r'python %s\%s' % (path, task), shell=True)
    for task
    in tasks
]
for task in task_processes:
    task.wait()
1 голос
/ 02 апреля 2019

Если вы хотите продолжать использовать многопроцессорность, вы можете просто инкапсулировать ваши системные вызовы в функцию:

import os
from multiprocessing import Process

path = "C:\\Users\\Max\\\\Desktop\\\python\\tasks\\"
tasks = ['1.py', '2.py', '3.py']

def foo(task):
    os.system('python ' + path + task)

for task in tasks:
    p = Process(target=foo, args=(task,))
    p.start()
0 голосов
/ 02 апреля 2019

На основании фактической цели ОП из комментария:

Я пытаюсь одновременно открывать разные ссылки в своем браузере с помощью модуля веб-браузера.По сути time.sleep(10) webbrowser.open("google.com") Но в каждом файле ссылка различна

, мы можем вместо этого использовать потоки.Я добавил опцию для другой задержки для URL, потому что в противном случае не было бы никакого смысла, чтобы каждый поток спал самостоятельно.

import webbrowser
import threading
import time


def delayed_open_url(delay, url):
    time.sleep(delay)
    webbrowser.open(url)


threads = []
for delay, url in [
    (3, "http://google.com"),
    (5, "http://example.com"),
    (11, "http://stackoverflow.com"),
]:
    threads.append(
        threading.Thread(target=delayed_open_url, args=(url,)).start()
    )

for thread in threads:
    thread.join()  # Wait for each thread

# This code will be executed after each thread is done
...