2013-08-27 82 views
0

基本上,我想使用腳本在不同的目錄中啓動其他腳本,並執行後續工作,直到完成所有「子腳本」爲止。我使用multiprocessing.Pool將所有子進程放在一起,並使用wait()等待所有完成。這是我的腳本:如何使用python腳本啓動其他python腳本並檢查所有「子腳本」是否完成?

import os, shutil, subprocess,sys, multiprocessing 

rootdir=os.getcwd() 
argument=[] 
def Openpy(inputinfo): 
    dirpath, filename= inputinfo 
    os.chdir(dirpath) 
    return subprocess.Popen([ 'python', filename ]) 

if __name__=="__main__": 
    for dirpath, dirname , filenames in os.walk(rootdir): 
     for filename in filenames: 
      if filename=='Test.py': 
       argument.append([ dirpath, filename ]) 
    print argument 
    po=multiprocessing.Pool() 
    r=po.map_async(Openpy, argument) 
    po.close() 
    r.wait() 

print 'Child scripts are finished' 

子進程正常啓動,並在一分鐘內完成。但是,這些子進程似乎沒有將其「完成的消息」返回給父進程。它沒有顯示「兒童腳本完成」。我能做些什麼來改變我的代碼,以便它可以正確檢測子進程的結束?

所有幫助表示讚賞!

2013年9月1日9:16 UTC + 8

J.F.塞巴斯蒂安的答案被接受。成功運行,清單理解的優雅用法使整個東西更具可讀性。

+0

縮進?我認爲最後一行也應該縮進一個'tab'。 – pwagner

回答

0

Popen()立即返回,以便您的父進程在您的子腳本之前完成,即在輸出的最開始處查找「完成的消息」。

你不需要multiprocessing同時運行子過程:

import os 
import sys 
from subprocess import Popen 

# run all child scripts in parallel 
processes = [Popen([sys.executable, filename], cwd=dirpath) 
      for dirpath, dirname , filenames in os.walk('.') 
      for filename in filenames 
      if filename == 'Test.py'] 

# wait until they finish 
for p in processes: 
    p.wait() 
print("all done") 

又見Python threading multiple bash subprocesses?

+0

您的方法有效。但是'Popen'能否利用我的多核cpu? 順便說一下,應該添加'來自子流程導入Popen'。 –

+0

@ user2720402:是的,'Popen'可以利用多個cpus(每個調用創建一個單獨的進程)。 – jfs

+0

謝謝你!還有一個問題,但與主題無關。只有模塊'threading.thread'在調用多個進程時不能使用多核cpu? –

0

試換r.wait()和po.close的位置()

if __name__=="__main__": 
    for dirpath, dirname , filenames in os.walk(rootdir): 
     for filename in filenames: 
      if filename=='Test.py': 
       argument.append([ dirpath, filename ]) 
    print argument 
    po=multiprocessing.Pool() 
    r=po.map_async(Openpy, argument) 
    r.wait() 
    po.close() 

它可能不是你的問題,但它看起來像也許你正在關閉池中的結果進行評估之前。

+0

我測試了你的代碼,但它仍然沒有來自子進程的'結束進程'響應。 –