2011-07-20 71 views
5

我必須在Windows 7上啓動並執行24個獨立的Python腳本。我希望這一個腳本可以在同一時間啓動它們,而不必管它們全部(我不是索隆)或等待它們的結束。我發現os.startfile()很有趣。但我並沒有在發送參數的24如何從一個啓動多個其他的Python腳本併發送參數?

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

如何將參數發送到這些腳本並將它們一起啓動?

+1

有一個看看'multiprocessing'模塊。它使得它更清潔,並且實際上是同樣的東西(它在Linux上更加高效,因爲它會影響當前進程。在Windows上,我認爲它與啓動多個新的Python進程是一樣的)。但是,如果您確實想要完成您所描述的內容,請查看「subprocess」模塊而不是「os.startfile」。 –

回答

-1

從子模塊(HTTP使用呼叫功能://文檔.python.org /庫/ subprocess.html#模塊子)。

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

我不認爲這是問了什麼......從文檔:帶參數的_Run命令。 **等待命令完成**,然後返回returncode屬性._ – mac

0

這樣的事情?

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

可以使用indipendent處理(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' 

然後就可以跟蹤哪些命令是由每個子進程簡單地存儲關聯於workid命令執行過程中(workid可以是遞增的計數器,當隊列獲得填充有新工作)。 multiprocessing.Queue的使用非常強大,因爲您不需要依賴stdout/err解析並避免相關限制。 此外,您可以輕鬆管理更多子流程。

然後,你還可以設置你想要多久get調用等待在最大超時,如:

import Queue 
try: 
    res = result.get(block = True, timeout = 10) 
except Queue.Empty: 
    print error 
相關問題