我正在利用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,因此这不是我关注的问题之一。有没有办法做到这一点,我错过了一些痛苦明显的东西?与我一起承担计算机科学不是我的力量,我是航空航天工程师。谢谢!
答案 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/*
...
对此文件进行排序可以正确设置PATH
和LD_LIBRARY_PATH
个环境变量。