問題來源
筆者曾經在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__.py
和 engines/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