Python - 使用os.subprocess使用嵌套命令调用shell脚本

时间:2018-02-26 15:42:02

标签: python shell subprocess openfoam

我正在利用python运行顶级遗传算法,使用OpenFOAM优化3D飞机机翼几何结构以获得空气动力学性能。我正在运行Ubuntu 16.04,Python 3.6和OpenFOAM 5.我编写了几个驻留在OpenFOAM案例目录中的shell脚本(包含几何STL文件,流体动态参数和网格的目录)。这些脚本执行重复的文件管理命令和OpenFOAM并行处理分解程序,以及生成3D网格并运行模拟的命令。 python脚本应完全位于不同的目录中,因为将生成数百个(如果不是数千个)这些案例文件夹作为遗传算法的后代。问题是使用os.subprocess调用这些shell脚本似乎为脚本中的每个命令生成并终止了一个shell。例如,如果我的代码是(简要版本):

#!/bin/bash
rm constant/polyMesh/*
rm constant/triSurface/*.eMesh
rm -rf 0.*
find -type d -name '*e-0*' -exec rm -r {} +
decomposePar (OpenFOAM utility)

我打电话给那个剧本:

subprocess.Popen(['./shellScript'],cwd=r'./pathToDirectory')

我最终收到错误:

./shellScript: line #: decomposePar no such file or directory

如果shell试图在case目录以外的目录中执行decomposePar,那么我可以看到这种情况发生的唯一方法(它应该在没有故障的情况下发生)。对于案例管理命令,只有第一个命令似乎有效。我已经刮掉了堆栈溢出来解决这个问题,但我不确定我是否找到了。我试图使用os.chdir('casePath')设置python脚本的工作目录,设置cwd='casePath'以及其他一些我不太了解的subprocess个参数!

我知道我可以将每个shell命令转录到Python中,但我发现由于shell命令的数量以及将来可能会更改这些shell脚本,这将非常繁琐。我希望我的方法是模块化的,足够健壮,只能运行几个我可以根据需要修改的脚本。此外,在一天结束时,该程序将部署到超级计算机。并行处理将在OpenFOAM中的C ++级别进行,而不是python,因此这不是我关注的问题之一。有没有办法做到这一点,我错过了一些痛苦明显的东西?与我一起承担计算机科学不是我的力量,我是航空航天工程师。谢谢!

1 个答案:

答案 0 :(得分:1)

TL; DR:从shell脚本开头的OpenFOAM安装中获取bashrc

在使用OP进行一些挖掘后,最初的问题是包含decomposePar的目录不在PATH环境变量中。

除非您的PATH中有.(这非常危险,请不要这样做),将当前目录更改为目录不会对查找decomposePar产生任何影响。在shell脚本中添加decomposePar的完整路径,允许运行decomposePar

示例:

#!/bin/bash
rm constant/polyMesh/*
rm constant/triSurface/*.eMesh
rm -rf 0.*
find -type d -name '*e-0*' -exec rm -r {} +
/full/path/to/decomposePar

但是,运行时无法加载所需的共享库,因为OpenFOAM共享库目录不在LD_LIBRARY_PATH环境变量中。要解决此问题,OpenFOAM bashrc文件来自脚本的开头。

示例:

#!/bin/bash
source /path/to/bashrc
rm constant/polyMesh/*
...

对此文件进行排序可以正确设置PATHLD_LIBRARY_PATH个环境变量。