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