abaqus python虽然是python,但是由于涉及众多类库、配置、动态库引用等原因,无法直接调用,而必须使用abaqus kernel才能运行。这就有点类似在pycharm中使用pyspark一样。我们知道,集成开发环境(IDE,Integrated Development Environment)只是一个方便写代码的壳子,其运行核心仍然是该语言的主编译器和后续调用命令。例如Java在windows系统下必然有个java.exe可执行文件,而Python语言也会有一个python.exe。具体到abaqus python,这个就有点不一样了,我们直接运行安装好的abaqus目录下面的python.exe是没办法运行abaqus python代码的,会发生如下错误:
PS D:\SIMULIA\Abaqus\6.14-4\code\bin> .\python.exe
ImportError: No module named site
进一步搜索我们发现不仅code文件夹下有个python.exe,在D:\SIMULIA\Abaqus\6.14-4\tools\SMApy\下还分别有一个python2.6和python2.7。
PS D:\SIMULIA\Abaqus\6.14-4\tools\SMApy\python2.7> .\python.exe
Python 2.7.3 (default, Oct 4 2012, 15:15:08) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from abaqus import *
Traceback (most recent call last):
File "", line 1, in
File "D:\SIMULIA\Abaqus\6.14-4\tools\SMApy\python2.7\lib\site-packages\abaqus.py", line 10, in
import sys, i18n, os, osutils
File "D:\SIMULIA\Abaqus\6.14-4\tools\SMApy\python2.7\lib\site-packages\i18n.py", line 6, in
import os, os.path, sys, uti, traceback, locale as _locale
File "D:\SIMULIA\Abaqus\6.14-4\tools\SMApy\python2.7\lib\site-packages\uti.py", line 9, in
import utiinternal
File "SMAPyaModules\SMAPyaUtiPy.m\src\utiinternal.py", line 52, in
File "SMAPyaModules\SMAPyaUtiPy.m\src\uticty.py", line 145, in
File "SMAPyaModules\SMAPyaUtiPy.m\src\uticty.py", line 136, in _loadAbaqusDll
ValueError: dll not found: ABQSMABasShared.dll
报错找不到DLL。这就进入了正题了,python有时候被称为胶水语言,正式因为它简洁的语法又能够调用不同语言所编写的程序,达到了性能和易于编程的双重目的。一般运行程序都会在当前目录和库目录查找dll文件,我们搜一下abaqus的安装目录,发现找不到的dll文件在这里D:\SIMULIA\Abaqus\6.14-4\code\bin,于是我们将其添加到环境变量(这里使用的是powershell命令)后再运行:
PS D:\SIMULIA\Abaqus\6.14-4\tools\SMApy\python2.7> $env:PATH=$env:PATH+";D:\SIMULIA\Abaqus\6.14-4\code\bin"
PS D:\SIMULIA\Abaqus\6.14-4\tools\SMApy\python2.7> .\python.exe
Python 2.7.3 (default, Oct 4 2012, 15:15:08) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from abaqus import *
Traceback (most recent call last):
File "", line 1, in
File "D:\SIMULIA\Abaqus\6.14-4\tools\SMApy\python2.7\lib\site-packages\abaqus.py", line 10, in
File "D:\SIMULIA\Abaqus\6.14-4\tools\SMApy\python2.7\lib\site-packages\i18n.py", line 111, in
NameError: name 'locale' is not defined
>>>
即使添加了环境变量、不报错找不到DLL后,仍然报错。
有的网友还遇到了最尴尬的问题,报错:
ImportError: abaqus module may only be imported in the Abaqus kernel process
abaqus将其内部的调用机制全部封装在了abaqus.bat这个运行源头上。如果安装abaqus添加了环境变量的话,会发现只有使用abaqus cae -script zigzag.py这样的命令才能正确运行abaqus python文件。其中-noGUI还可提供只生成cae文件不打开abaqus主界面的选项。
最终解决办法:
如果我们仅仅需要编辑abaqus python,用它提供的abaqus PDE就好了,那么我们为什么想用pycharm呢?当然是希望使用它强大的类型检查、代码补全功能。因为最终只能调用abaqus命令来运行,所以我们就制作了这么一个“代理·abaqus类库”,库中所有引用文件都只提供类型检查而不提供真正的可执行语句,当用户最后save的时候,才去调用abaqus主程序。为了使得类库对原有代码的冲击最小,我们使用环境变量来获取abaqus主程序的目录。该项目地址在这里https://github.com/liangzulin/abaqus_pycharm。
只需要将该项目中的import_files文件夹中的文件,拷贝到相应python类库的site-packages文件夹里边就可以了。
需要设置一下abaqus环境变量,例如你安装的abaqus在D:\SIMULIA\Abaqus\,那么需要在代码最前面添加2行:
from os import environ
from abaqus import *
from abaqusConstants import *
from caeModules import mesh
from driverUtils import executeOnCaeStartup
# ====================== 添加这两行 =========================
environ['ABAQUS_BAT_PATH'] = 'D:\\SIMULIA\\Abaqus\\Commands\\abaqus'
environ['ABAQUS_BAT_SETTING'] = 'noGUI'
session.Viewport(name='Viewport: 1', origin=(0.0, 0.0), width=300, height=140)
session.viewports['Viewport: 1'].makeCurrent()
session.viewports['Viewport: 1'].maximize()
余下的程序就正常编写就OK。