Loop-выполнение набора скриптов Python с аргументами из основного скрипта - PullRequest
0 голосов
/ 20 октября 2019

У меня есть дочерний скрипт на python, который принимает аргумент и занимает ок. 8 минут до запуска.

e.g. python.exe child.py "2018-01-01"

Мне нужно много раз выполнить этот скрипт из основного скрипта. Я рассматриваю возможность использования subprocess.Popen.

import os, sys, time, subprocess
for date in ["2018-01-01", "2018-01-02", "2018-01-03", ..., "2018-12-31"]
    p = subprocess.Popen(['python.exe', "child.py", date])
    time.sleep(600)

Поскольку функция Popen не знает, когда завершается выполнение дочернего сценария, она просто продолжает вызывать дочерний сценарий с аргументом. Поэтому мне нужно было установить 600 секунд времени ожидания (дольше, чем приблизительное время выполнения дочернего сценария), чтобы последующий запуск благополучно начинался после завершения предыдущего запуска.

Интересно, есть ли более эффективныйспособ справиться с этой ситуацией.

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Если сценарии должны выполняться синхронно, рассмотрите возможность использования subprocess. Более конкретно, функция run (> = 3,5). Или даже функция call (<3.5), которая совпадает с <code>run, но возвращает только код из скрипта. Оба блокируют вызывающий скрипт до возврата.

Ваш код станет:

import shlex
import subprocess

for date in ["2018-01-01", "2018-01-02", "2018-01-03", ..., "2018-12-31"]:
    command = 'python.exe child.py %s' % date
    args = shlex.split(command)
    res = subprocess.run(args)

Если вам нужно, чтобы он работал асинхронно, рассмотрите возможность использования xargs. Если вам действительно нужно сделать это в Python, используйте multiprocessing наш multiprocessing.dummy, чтобы сделать это.

0 голосов
/ 20 октября 2019

как насчет этого, вызовите wait (), чтобы текущий подпроцесс был выполнен перед запуском другого.

for date in ["2018-01-01", "2018-01-02", "2018-01-03", ..., "2018-12-31"]
    p = subprocess.Popen(['python.exe', "child.py", date])
    p.wait()
    rc = p.returncode
    print(rc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...