Netgen/NGSolve是做有限元剖分的开源包,最近有个项目需要同时对多个三维物体进行有限元剖分,Netgen自带的GUI运行程序无法满足这种灵活运用需求,运行速度被拖累,遂转向其python版本NGS-Py
官方网页上显示在python下面的安装方式支持Anaconda
conda config --add channels conda-forge
conda config --add channels ngsolve
conda install ngsolve
开发环境为 win10,Anaconda3,python 3.7
脚本很简单
import sys
import ngsolve
from ngsolve import ngsglobals
from netgen import stl as NetGenStl
# turn off output information
ngsglobals.msg_level = 0
def pyMesh(stlfile): # , optfile):
filename = "%s.stl" % stlfile
geo1 = NetGenStl.STLGeometry(filename) # "test.stl")
m1 = geo1.GenerateMesh(maxh=4)
m1.Refine()
filename = "%s.vol" % stlfile
m1.Save(filename)
filename = "%s.txt" % stlfile
m1.Export(filename, 'Neutral Format')
pyMesh(sys.argv[1])
脚本是对stl文件中轮廓所定义的三维物体进行剖分,脚本运行ok
打包时首先考虑的是py2exe,发现不支持python 3.7遂放弃
安装PyInstaller:pip install pyinstaller
打包命令:pyinstaller -F pymesh.py
同网上所有人遇到一样的问题,生成的是个200+MB的exe大程序,exe大程序启动很慢,明白是因为pyinstaller在Anaconda环境下会打包进去很多没用的package
遂转向pipenv寻求建立一个虚拟环境,安装必须的module,尽量缩小打包后的exe文件
诡吊的是:pipenv install netgen,pip list 后
显示netgen版本为0.3.0,这个命令安装的netgen包是 https://pypi.org/project/netgen/ , 是一个生成网络拓扑的工具,根本不是用来进行有限元剖分的,netgen/ngsolve在pip源里没有,不被支持
遂乖乖退出虚拟环境,老老实实在Anaconda Prompt中用 pyinstaller pymesh.py 打包脚本,生成的文件夹内一堆莫名其妙的package和dll文件
里面明显有很多不被生成的exe程序package和dll文件,经过多次测试运行exe程序,可直接将无用的package和文件移出当前目录,大大减少最终生成的exe文件及其所需要的文件。
总结:这样处理虽然笨一点,不能得到一个单一可执行程序,但是这样生成的exe文件小,内存加载快,启动运行速度和运行时间明显比200+MB的exe划算多了。