2011-07-20 10 views
5

Muszę uruchomić i uruchomić 24 niezależne skrypty Pythona w systemie Windows 7. Chcę, aby jeden skrypt uruchamiał je wszystkie w tym samym czasie ... bez rządzenia nimi wszystkimi (nie jestem Sauronem) lub czekania ich końca. Uważam, że plik os.startfile() jest interesujący. Ale nie udało się wysyłanie argumenty do tych 24.Jak uruchomić wiele innych skryptów Pythona razem od jednego i wysłać im argumenty?

coincoin1.py (jeden skrypt, który zostanie uruchomiony 24)

import sys 
print "hello:",sys.argv 

Anti_Sauron_script.py (ten, który rozpocznie się 24 razem)

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

Jak wysłać argumenty do tych skryptów i uruchomić je wszystkie razem?

+1

spojrzeć na moduł 'multiprocessing'. To sprawia, że ​​jest to znacznie czystsze i faktycznie jest to samo (jest znacznie skuteczniejsze w Linuksie, ponieważ prezentuje obecny proces.) W systemie Windows, wydaje mi się, że jest tak samo efektywny jak uruchamianie wielu nowych procesów Pythona). Jeśli naprawdę chcesz zrobić dokładnie to, co opisujesz, spójrz na moduł 'subprocess' zamiast' os.startfile'. –

Odpowiedz

-1

Użyj funkcji wywołania z modułu subprocess (http: // docs .python.org/library/subprocess.html # module-subprocess).

import subprocess 
subprocess.call([path, arg1, arg2...]) 
+1

Nie sądzę, że to jest to, o co się pytano ... Z dokumentu doc: command z argumentami. ** Poczekaj na zakończenie komendy **, a następnie zwróć atrybut kodu powrotu ._ – mac

0

coś takiego?

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

można wykorzystać proces Niezależne (multiprocessing.Process) oraz za pomocą dwóch kolejki się z nim (multiprocessing.Queue) jeden na wejściu i na drugim na wyjściu. przykład na rozpoczęcie procesu:

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' 

Następnie można śledzić, które polecenie jest wykonywany przez każde podproces prostu przechowującej polecenia związane z workid (the workid może być licznik zwiększany, gdy kolejka się wypełnione Nowa praca). Użycie multiprocessing.Queue jest niezawodne, ponieważ nie trzeba polegać na analizie stdout/err, a także uniknąć powiązanych ograniczeń. Co więcej, możesz łatwo zarządzać więcej podprocesami.

Następnie można również określić czas, na jak długo chcesz wywołanie get czekać na max, np

import Queue 
try: 
    res = result.get(block = True, timeout = 10) 
except Queue.Empty: 
    print error 
Powiązane problemy