从python脚本调用别名命令

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文件转换命令

PM *_*ing 5

即使您解决了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命令更易于阅读。

显然,我无法在我的机器上测试确切的命令序列,但它应该可以工作。

  • 谢谢你的想法 它起作用了,我就像您建议的那样使用了p = 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;对于i在'+ path +'/ *中;执行surfaceConvert $ i $ i.stlb; done',shell = True)p.wait()` (2认同)