最近因为科研,我需要在python的代码中调用matlab的脚本/函数,然后需要安装配置matlab.engine。我用了前后一周的时间分别在Windows和Linux系统上配置好了,而且我在linux系统上(服务器)没有root权限。所以,踩了非常多的坑,而且许多问题mathwork的官网也没有解答,所以也许这套解决方法是全网第一,hhhhhh 。
一、matlab.engine在Windows上的安装
首先在Windosws上,还是比较容易的。先找到matlab的安装目录,在matlabroot\extern\engines\python下找到setup.py。cmd中在上面的路径下键入python setup.py install就可以了。
>cd matlabroot\extern\engines\python
>python setup.py install
在使用的时候用下面的函数就可以愉快的调用matlab函数/脚本了
import matlab.engine
eng = matlab.engine.start_matlab()
eng.matlabfun()##matlabfun表示某个matlab函数
只需要注意,python的版本matlab支持的是有限制的,然后注意事先添加好python的环境变量。
二、matlab.engine在Linux上的安装
如果小伙伴的linux系统拥有root权限,那么和windows是上并无差别。**然而!!**有些童鞋是课题组的服务器,或者别的原因没有root权限,这就非常坑了!因为你没办法在matlab和python的安装目录里新建文件。当然,你可以选择在自己的用户目录下重新安装matlab和python,然后export path也可以。可是,python还好装,可是matlab又花钱(破解版又麻烦 )同时还特别大,貌似没有root权限也提取不了iso,还要从windows提取iso文件再上传,非常痛苦有没有!!!
所以,我发现matlab官网提供了非root权限(包括没有matlab的权限或者没有python的权限,以及二者都没有的三种情况)的安装方式送上链接:https://ww2.mathworks.cn/help/matlab/matlab_external/install-matlab-engine-api-for-python-in-nondefault-locations.html非root安装的matlab官网链接
cd "matlabroot\extern\engines\python"
python setup.py build --build-base="builddir" install --prefix="installdir"
##builddir和installdir是你想放在的两个路径,自己设置的
然而这里面还是很多坑,首先这个帮助文档告诉我们要提前加入你的installdir,然而,其实还不够。这个路径下还有很多层文件夹,一定要延申到matlab文件夹的前一级目录,这个目录下除了matlab文件夹,还有一个matlabengineforpython-RXXXX-pyX.X.egg-info的文件,这个文件非常重要,等下再提。
到这里,你就可以愉快的导入matlab.engine了,我这里用sys.path的方式加入路径
import sys
sys.path.append("installdir/lib/···/site-position")
import matlab.engine
然而,当你发现此时没报错的时候,以为万事大吉之时,**还有最大的坑就要来临!!!**如果此时你运行一下上面的eng = matlab.engine.start_matlab()代码,会发现下面的错误
EngineError: Unable to launch MVM server: License Error when using MATLAB Engine with python
而这个问题在mathworks的社区中没有一个有效的回答,都是说查看什么查看matlab版本了,检查matlab是否正常了,这些废话,根本不解决问题有木有!!
所以,我研究发现这里提示的是license error,而我研究了很久发现了这个重要的文件,也就是前面说的matlabengineforpython-RXXXX-pyX.X.egg-info,打开之后是这样的
Metadata-Version: 1.0
Name: matlabengineforpython
Version: R2018a
Summary: A module to call MATLAB from Python
Home-page: https://www.mathworks.com/
Author: MathWorks
Author-email: UNKNOWN
License: UNKNOWN ##注意这一行
Description: UNKNOWN
Platform: Linux
Platform: Windows
Platform: MacOS
很坑啊有没有,谁能想到License居然是UNKNOWN!!所以后面才会license error吧。然后我尝试在这里输入license许可号码,发现没用。然后我发现matlab的安装目录下有一个licenses的文件夹,把这个文件夹的路径写在这里就好了
Author: MathWorks
Author-email: UNKNOWN
License: /user/···/matlab/licenses ##你自己的matlab目录
Description: UNKNOWN
Platform: Linux
然后你运行下面的代码就没问题了
import matlab.engine
eng = matlab.engine.start_matlab()
祝各位python调用matlab愉快!!