Как запустить несколько других скриптов Python вместе и отправить им аргументы? - PullRequest
5 голосов
/ 20 июля 2011

Мне нужно запустить и выполнить 24 независимых скрипта Python на Windows 7. Я хочу, чтобы один скрипт запускал их все одновременно ... не управляя ими всеми (я не Саурон) или не дожидаясь их окончания. Я нахожу os.startfile () интересным для этого. Но мне не удалось отправить аргументы этим 24.

coincoin1.py (один из 24 запускаемых скриптов)

import sys
print "hello:",sys.argv 

Anti_Sauron_script.py (тот, который запустит все 24 вместе)

sys.argv=["send","those","arguments"] 
os.startfile("C:\\Users\\coincoin1.py")

Как отправить аргументы в эти сценарии и запустить их все вместе?

Ответы [ 4 ]

4 голосов
/ 20 июля 2011

Вы можете использовать независимый процесс (multiprocessing.Process) и использовать две очереди для связи с ним (multiprocessing.Queue), одну для ввода и другую для вывода. Пример запуска процесса:

import multiprocessing

def processWorker(input, result):
    work = input.get()
    ## execute your command here
    pipe = subprocess.Popen(command, stdout = subprocess.PIPE,
                             stderr = subprocess.PIPE, shell = True)
    stdout, stderr = pipe.communicate()
    result.put(pipe.returncode)

input  = multiprocessing.Queue()
result = multiprocessing.Queue()

p = multiprocessing.Process(target = processWorker, args = (input, result))
p.start()
commandlist = ['ls -l /', 'ls -l /tmp/']
for command in commandlist:
    input.put(command)
for i in xrange(len(commandlist)):
    res = result.get(block = True)
    if not res is 0:
        print 'One command failed'

Затем вы можете отслеживать, какая команда выполняется каждым подпроцессом, просто сохраняя команду, связанную с рабочим идентификатором (рабочий идентификатор может быть счетчиком, увеличиваемым при заполнении очереди новой работой). Использование многопроцессорной обработки. Queue является надежным, поскольку вам не нужно полагаться на разбор stdout / err, и вы также избегаете связанных ограничений. Более того, вы можете легко управлять большим количеством подпроцессов.

Затем вы также можете установить тайм-аут на то, как долго вы хотите, чтобы вызов get ожидал на максимуме, например:

import Queue
try:
    res = result.get(block = True, timeout = 10)
except Queue.Empty:
    print error
2 голосов
/ 20 июля 2011

Вы хотите использовать модуль подпроцесса: http://docs.python.org/library/subprocess.html и, в частности, первый пример в этом подразделе процессов порождения, не дожидаясь их завершения http://docs.python.org/library/subprocess.html#replacing-the-os-spawn-family

1 голос
/ 20 июля 2011

как то так?

from subprocess import Popen, PIPE

python_scripts = ['coincoin1.py','coincoin2.py','coincoin3.py'...]
args = ' -w hat -e ver'

procs = []
for f in python_scripts:
    procs.append(Popen(f+args, shell=True,stdout=PIPE,stderr=PIPE))

results = []

while procs:
    results.append (procs.pop(0).communicate())

do_something_with_results(resuls)
0 голосов
/ 20 июля 2011

Используйте функцию вызова из модуля подпроцесса (http://docs.python.org/library/subprocess.html#module-subprocess).

import subprocess
subprocess.call([path, arg1, arg2...])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...