Python使用操作系统子流程使用嵌套命令调用shell脚本

2024-10-01 22:36:49 发布

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

我正在利用python运行一个顶级的遗传算法,用OpenFOAM优化3D飞机机翼的气动性能。我在运行Ubuntu16.04、Python3.6和OpenFOAM 5。我已经编写了几个shell脚本,它们位于OpenFOAM case目录(包含几何体STL文件、流体动力学参数和网格的目录)。这些脚本执行重复的文件管理命令和OpenFOAM并行进程分解程序,以及生成3D网格和运行模拟的命令。python脚本应该位于完全不同的目录中,因为数百(如果不是数千个)这样的案例文件夹将作为遗传算法的后代生成。问题是操作系统子流程调用这些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)

我称之为脚本:

^{pr2}$

最后我得到了一个错误:

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

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

我知道我可以将每个shell命令转录成Python,但是我发现由于shell命令的数量以及将来对这些shell脚本进行更改的可能性,这将非常乏味。我希望我的方法是模块化的,足够健壮,只运行其中几个脚本,我可以根据需要进行修改。此外,在一天结束时,这个程序将被部署到一台超级计算机上。并行处理将在OpenFoSE中的C++级别进行,而不是Python,所以这不是我关心的问题之一。有没有办法做到这一点?我是否遗漏了一些痛苦而明显的东西?容忍我,因为计算机科学不是我的强项,我是一名航天工程师。谢谢!在


Tags: 文件rm命令程序目录脚本网格参数

热门问题