簡體   English   中英

如何使用python腳本啟動其他python腳本並檢查所有“子腳本”是否都已完成?

[英]How to use python script to start other python scripts and check whether all “child scripts” are finished?

基本上,我想使用一個腳本在不同目錄中啟動其他腳本,並進行后續工作,直到完成所有“子腳本”。 我使用multiprocessing.Pool將所有子進程放在一起,並使用wait()等待所有操作完成。 這是我的腳本:

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

塞巴斯蒂安·JF的答案被接受。 成功運行,優雅地使用列表理解使整個內容更具可讀性。

嘗試交換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()

可能不是您的問題,但看起來您可能正在關閉池,然后才評估結果。

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線程化多個bash子進程?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM