关于OpenFOAM的Python脚本代码的疑惑

大家好,请问下面代码中bash -c -i "postProcess -time 0 -func writeCellCentres"的意思是什么?我理解subprocess,call是python开启的子进程,我疑惑的是,bash,还有-c, -i 这些东西。有人可以帮忙解答一下吗

还有,关于postProcess -time 0 -func writeCellCentres这个functionObject有没有更多的说明,谢谢大家

#调用OpenFOAM的命令获取单元坐标
try:
    subprocess,call(' bash -c -i "postProcess -time 0 -func writeCellCentres" ', shell = Flase)
except:
    print("生成坐标失败!")
import subprocess
#调用OpenFOAM的命令获取单元坐标
try:
    subprocess.call(' bash -c -i "postProcess -time 0 -func writeCellCentres" ', shell = True)
except:
    print("生成坐标失败!")

其中

' bash -c -i "postProcess -time 0 -func writeCellCentres" '

是一可执行的 shell 的命令,shell 是 linux 中使用的一种文字界面,bash 就是 shell 的一种形式,通过它,可以对 linux 的进行操作,另一种界面就是我们通常见到的图形界面。

-c 是指从第一个非可选的项开始读取命令;

-i 表示执行交互式命令,比如需要输入的数据等。

详细的可参考:bash – linux manual page

postProcess 可参考: OpenFOAM v6 User Guide: 6 Post-processing

你好,谢谢你的回复,在算例终端下直接运行postProcess -time 0 -func writeCellCentres会报错,提醒Cannot find functionObject file writeCellCetres, 是不是还需要一些其他文件才能够使用这个后处理过程,关于这个后处理代码如何使用,能否提供一个示例,谢谢(User Guide只有简介其功能,没有使用过程)

我这里试了下没有问题。是不是你的编译不全?你检查下 OpenFOAM 文件夹下 bin 里面是不是有 writeCellCentres.

cd $FOAM_APP/../bin
ls -lah writeCellCen*

看看有没有这个文件。

后处理好像还没有什么教程,这个比较早,你可以做个参考:
Examples of how to use some utilities and functionObjects

谢谢你,目前已经可以了。而且出现很奇怪难以解释的现象,最开始试了很多次一直没成功,我才回复了上一条的内容。但是我觉得应该不是版本问题(因为我看的说明就是我目前的版本),然后又反复试了很多次,还尝试在system文件夹中添加functionObject文件,但是还是没成功,不知道试了多少次,在某个瞬间,突然成功了一次,我以为是我之前的输入有误,仔细对比输入,发现每次都是postProcess -time 0 -func writeCellCentres正确无疑。然后我删掉生成的C、Cx、Cy、Cz文件,准备再来一次。结果发现,(采用直接复制上次成功运行的postProcess -time 0 -func writeCellCentres),又出现Cannot find functionObject file writeCellCetres的错误,这太奇怪了,然后我再次复制postProcess -time 0 -func writeCellCentres,关闭终端,再打开,再粘贴,重试,没成功,,接下来又尝试了很多方法,但是每次试之前,我都是采用复制粘贴postProcess -time 0 -func writeCellCentres,,,再后来试了很多次,成功了,目前一直都可以成功。。然后我很疑惑之前我的计算机是哪根筋搭错了,还是系统不稳定的原因??真的很诡异

在此期间,我仅仅修改过controlDict文件内容,就是在controlDict文件最末尾加了几行代码,然后又删掉加的代码,目前是不需要加(原始状态下就可以成功),既然这样,反反复复折磨我这么久,第一次什么也没加的时候怎么就没有成功,每次都是认真核对了postProcess -time 0 -func writeCellCentres是否输入有误,更多的是直接复制粘贴。更离谱的是刚试成功,什么也没改,再试一次又失败的那段时间感觉真的真的太奇怪了

有时候就是会抽风,这种情况我也遇到过。那时是刚把 Linux OpenFOAM 等装上,硬盘是 SSD 的,有时候就是找不到某个文件,死活都找不到。这种情况持续了几天,后来就没有发生过了。在原来的机械硬盘上没有发生过这种情况。

大神,感觉除了OpenFOAM,你也是python大神。我问一个python问题。
我最近遇到sys.stdout.write(),百度了一下,都是如下所说:
sys.stdout.write(‘hello’+’\n’)与print(‘hello’)是等价的,但是我在我的笔记本测试了一下(Ubuntu16.04,通过anaconda装了python3.6.5)

>>>sys.stdout.write('hello'+'\n')
hello
6
>>>sys.stdout.write('hello')
hello5
>>>print('hello')
hello

结果并不像百度说的这样,二者是不等价的。

补充一点,如果在脚本里写sys.stdout.write(‘hello’+’\n’),在终端显示的就是:
hello
就不会出现那个6了,上一个帖子的不等价的现象是交互式环境。

不算大神哈,只是用得多一点。多在网上查一些。

sys.stdout 是标准输出文件,write 是往这个文件写数据,连在一起就是打印数据到标准终端。

在交互模式下会显示函数返回值,而在命令行里不会显示。而 write 函数会返回字符串的大小。所以,你在交互模式下就会看到一个数字放在字符串末尾。

如果你不想在交互式环境里面显示出字符串大小,可以将其返回值赋给一个变量,如

import sys
sizeH=sys.stdout.write('hello'+'\n')

这样的话,输出就只有 hello 这一行了。

谢谢大佬的回复,我明白了,嘻嘻,大神真厉害,大腿我要抱得紧紧的。
我再问几个问题:

  1. 在OpenFOAM的一些算例中,使用shell脚本Allrun文件来运行算例。我们可比可以用python脚本来运行OF的算例呢?
  2. 对于python调用shell指令的形式是不是都是类似于之前说的
bash -c -i "postProcess -time 0 -func writeCellCentres"

也就是说:

bash -c -i + "OpenFOAM命令"

期待回复,谢谢

这个完全可以胜任你的任务

请问一下,我用postProcess -time 0 -func writeCellCentres输入时也出现了同样的错误。用find -name writeCellCentres 寻找这个文件时也没找到;楼主所说的在system文件夹中添加functionObject文件,但我用find -name functionObject寻找这个文件时,其各个目录下并没有writeCellCentres这个文件。请问您是怎么解决的

检查下 $FOAM_APP/…/bin 里面有没有 writeCellCentres,这个文件不在 case 目录里面

ls -lah $FOAM_APP/../bin/write*

谢谢大神的指导,但还是没找到,我用了 funkySetFields来设置非均匀流场