确保执行顺序子流程.Popen电话

2024-05-28 18:25:22 发布

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

我在用子流程.Popen为Scipy堆栈创建自动生成脚本。在

我目前的流程如下。在

在mathbuild.json格式公司名称:

{"suitesparse": {"version": "4.2.1",
         "dependencies": ["metis"],
         "downloads": ["http://www.cise.ufl.edu/research/sparse/SuiteSparse/SuiteSparse-4.2.1.tar.gz"],
         "build": ["cd $DL_DIR",
               "tar xvfz SuiteSparse-4.2.1.tar.gz",
               "cd SuiteSparse",
               "cp -r $DL_DIR/metis-4.0.3 metis-4.0.3"]},

 "metis": {"version": "4.0.3",
       "dependencies": [],
       "downloads": ["http://glaros.dtc.umn.edu/gkhome/fetch/sw/metis/OLD/metis-4.0.3.tar.gz"],
       "build": ["cd $DL_DIR",
             "tar xvfz metis-4.0.3.tar.gz",
             "cd metis-4.0.3",
             "make"]}}

在数学构建.py公司名称:

^{pr2}$

它创建一个依赖项列表(这样以后的项依赖于前面的项),然后处理每个依赖项(下载并基于json文件中的命令构建)。在

问题是在完全构建依赖项之前,通过新的subprocess.Popen调用来构建包。在上面的例子中,suitesparse执行甚至在metis构建完成之前就开始了。我假设这是因为我每次都会围绕for package in package_list('suitesparse', cfg)循环打开一个新的子进程,而不管前面的子进程是否完成。在

问题 同步基于循环的Popen调用的最佳方法是什么,以便每次调用只在上一次对Popen的调用(即列表中的前一项)完成后才开始?在

我尝试过的 我尝试过更改循环,以便它构建一个组合的Popen(同时包含两个包的构建),但这似乎太老土了。在


Tags: 名称jsonversiondircddependencies公司tar
1条回答
网友
1楼 · 发布于 2024-05-28 18:25:22

看起来你想要subprocess.check_call()而不是Popen。来自the docs

Run command with arguments. Wait for command to complete. If the return code was zero then return, otherwise raise CalledProcessError.

您的构建函数看起来像:

def build_package(package, config):
    command = '; '.join(config[package]['build'])
    subprocess.check_call(command, shell=True)

如果实际使用的是Popen对象,可以调用wait()方法等待子命令完成:

^{pr2}$

相关问题 更多 >

    热门问题