[python][matlab]在python36上安装matlab2015b引擎

问题来源

笔者曾经在python34上安装matlab接口,当时使用的版本为matlab 2015b,众所周知,2015年还没发行py36,所以只能支持到py34。这种不兼容有两种解决办法,你可以通过查看本地的matlab文档进而知道支持的py版本,升级到高版本的matlab可以支持更高版本的py。当然也可以新建旧版本的py,比如笔者就是使用anaconda建立了一个py34的库,相比于升级matlab,降级py是更简单的做法。
相对应的做法可以参考我上一篇博文的做法:
https://www.cnblogs.com/wildkid1024/p/10417183.html

新的问题

但是不是新建库就解决问题了呢,随之而来的新问题是,假如我们其他编程库依赖于更新版本的py版本,那么我们不得不忙于不停地版本切换。最佳的解决方案,是py36兼容matlab 2015b,甚至是其他版本。但是如果切换到python36再运行上述的安装方案时,便会出现错误:

Python 3.6 is not supported.

原来是官方的setup文件里不支持py3.6,那么怎么办呢?

解决方案

通过阅读engine源码文件,我们可以得知,原来受支持的版本在一个列表中,于是,我们需要找到以下文件engines/python/build/lib/matlab/engine/__init__.py,然后修改对应的受支持列表为:

_supported_versions = ['2_7', '3_3', '3_4', '3_6']

同样,通过不断地追踪错误,我们很容易找到另外两个版本支持列表的文件:
engines/python/dist/matlab/engine/__init__.pyengines/python/setup.py,依次进行同样的修改即可。

当再次运行python setup.py install时,仍然会报错:

ModuleNotFoundError: No module named 'matlabengineforpython3_6'

matlabengineforpython3_6是一个编译好的py二进制库,当然没办法再编译,当然一个解决方法就是修改py34的二进制库即可。需要复制/engines/python/dist/matlab/engine/win64/matlabengineforpython3_4.pyd复制到同文件夹下,然后改为matlabengineforpython3_6.pyd即可。剩下的工作还需要一个二进制代码编辑器,然后将其中的所有3_4修改为3_6即可。在win下,可能还需要一些修改,将python34.dll修改为python36.dll

当再次运行python setup.py install时,经过一番安装之后,就可以使用以下的程序来验证是否安装成功:

import sys
print(sys.version)

import matlab.engine
eng = matlab.engine.start_matlab()
print(eng.sqrt(4.))

小插曲

当使用linux操作系统的时候,很可能遇到文件读写权限问题,相关的操作可以按照官方给出的文档进行操作:参见[2].

引用

[1]. https://gist.github.com/dangom/303879ca649f7a3fe113912d7ffa62d4

[2]. https://ww2.mathworks.cn/help/matlab/matlab_external/install-matlab-engine-api-for-python-in-nondefault-locations.html

[3]. https://www.cnblogs.com/wildkid1024/p/10417183.html

原文地址:https://www.cnblogs.com/wildkid1024/p/11099718.html