python асинхронный запуск нескольких сабпроцессов

Есть несколько питоновских файлов, лежащих в одной папке. Вместе с ними лежит файлик run_scripts, который должен их всех одновременно запустить из терминала командой python -m scripts.run_scripts

В этом стартовом файле следующий код:

async def main():
    await asyncio.gather(asyncio.run("python3 -m scripts.script1", shell=True),
                         asyncio.run("python3 -m scripts.script2", shell=True),
                         asyncio.run("python3 -m scripts.script3", shell=True),
                         asyncio.run("python3 -m tests.script4", ))


main()

Пытался передать в функцию subprocess.run вместо asyncio.run, но такой аргумент не принимается. Пример выше тоже не проходит. Также пытался запускать main с async & await, не работает.

Как это сделать?

ОС Линукс.


Ответы (2 шт):

Автор решения: Noskill

вот вариант с субпроцессами.

import subprocess

def run_script(script):
    subprocess.Popen(["python3", "-m", script])

def main():
    scripts = [scripts.script1..., 2 и тд]
    for script in scripts:
        run_script(script)

if __name__ == "__main__":
    main()

но если мы везде юзаем асинхронщину, то можно и так

import asyncio
# вот функция для запуска процесса
async def run_script(script):
    await asyncio.create_subprocess_exec("python3", "-m", script)
# голова
async def main():
    scripts = [scripts.script1 и тд]
    await asyncio.gather(*[run_script(script) for script in scripts])
# сам запуск
if __name__ == "__main__":
    asyncio.run(main())
→ Ссылка
Автор решения: Garp
import os
import subprocess
import sys
import threading



def run_script(script):
    script = 'python3 -Wignore -m tests.{}'.format(script)
    subprocess.call(script, shell=True)

def main():
    for file in os.listdir('tests'):
            thread = threading.Thread(target=run_script, args=(file.split('.')[0],))
            thread.start()

if __name__ == "__main__":
    main()
→ Ссылка