[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM