【问题标题】:How to use python script to start other python scripts and check whether all "child scripts" are finished?如何使用python脚本启动其他python脚本并检查所有“子脚本”是否完成?
【发布时间】:2013-08-29 19:17:19
【问题描述】:

基本上,我想使用一个脚本来启动不同目录中的其他脚本并进行后续工作,直到所有“子脚本”都完成为止。我使用 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

J.F.塞巴斯蒂安的回答被接受了。成功运行并优雅地使用列表推导使整个内容更具可读性。

【问题讨论】:

  • 缩进?我认为最后一行也应该缩进一个“制表符”。

标签: python subprocess multiprocessing


【解决方案1】:

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?

【讨论】:

  • 你的方法有效。但是Popen 可以使用我的多核 cpu 吗?顺便说一句,应该添加from subprocess import Popen
  • @user2720402:是的,Popen 可以使用多个 cpu(每个调用创建一个单独的进程)。
  • 谢谢你!还有一个问题,但与主题无关。是不是只有模块threading.thread在调用多进程时不能利用多核cpu?
  • @user270402:除非采取特殊措施,否则多个进程可以使用多个 CPU
【解决方案2】:

尝试交换 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()

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

【讨论】:

  • 我测试了你的代码,但它仍然没有来自子进程的“结束进程”响应。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 2023-03-27
  • 2010-11-20
相关资源
最近更新 更多