Bal*_*des 2 python bash shell subprocess openfoam
我需要通过自动化的python脚本运行OpenFOAM命令。
我的python代码包含以下几行
subprocess.Popen(['OF23'], shell=True)
subprocess.Popen(['for i in *; do surfaceConvert $i file_path/$i.stlb; done', shell=True)
Run Code Online (Sandbox Code Playgroud)
其中OF23是shell命令,在别名中定义为
alias OF23='export PATH=/usr/lib64/openmpi/bin/:$PATH;export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib/:$LD_LIBRARY_PATH;source /opt/OpenFOAM/OpenFOAM-2.3.x/etc/bashrc'
Run Code Online (Sandbox Code Playgroud)
该脚本在终端中运行OpenFOAM命令,并且file_path定义了将stl文件转换为二进制格式的文件
但是,当我运行脚本时,得到的未定义为“ OF23”。
如何使我的脚本运行别名命令并执行下一个OpenFOAM文件转换命令
即使您解决了alias问题,这也行不通。每个Python subprocess.Popen在单独的子shell中运行,因此执行的效果OF23不会持续到第二个subprocess.Popen。
这是一个简短的演示:
import subprocess
subprocess.Popen('export ATEST="Hello";echo "1 $ATEST"', shell=True)
subprocess.Popen('echo "2 $ATEST"', shell=True)
Run Code Online (Sandbox Code Playgroud)
输出
1 Hello
2
Run Code Online (Sandbox Code Playgroud)
因此,无论您使用别名还是直接执行别名命令,都需要将命令组合成一个subprocess.Popen调用。
例如:
subprocess.Popen('''export PATH=/usr/lib64/openmpi/bin/:$PATH;
export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib/:$LD_LIBRARY_PATH;
source /opt/OpenFOAM/OpenFOAM-2.3.x/etc/bashrc;
for i in *;
do surfaceConvert $i file_path/$i.stlb;
done''', shell=True)
Run Code Online (Sandbox Code Playgroud)
我使用了三引号引起来的字符串,以便插入换行符,以使Shell命令更易于阅读。
显然,我无法在我的机器上测试确切的命令序列,但它应该可以工作。