如何使用python脚本启动其他python脚本并检查所有“子脚本”是否完成?

2024-09-30 22:23:47 发布

您现在位置:Python中文网/ 问答频道 /正文

基本上,我想用一个脚本在不同的目录下启动其他脚本,并做后续工作,直到所有的“子脚本”都完成。我使用多处理.池将所有子进程放在一起并使用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

塞巴斯蒂安的回答正在被接受。成功运行并且优雅地使用列表理解使整个内容更具可读性。在


Tags: 脚本forif进程osfilenameargumentmultiprocessing
2条回答

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?

尝试交换r.wait()和订单关闭()

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

这可能不是您的问题,但看起来您可能在评估结果之前关闭了池。

相关问题 更多 >