python可以直接使用matlab提供的API(engine)调用matlab中的function,官方安装教程在这里。 但是在多python环境下的Linux系统中配置的话,matlab.engine总是有很多问题。 记录一下各种坑:
- 首先,一定要注意matlab和python的版本对应问题,在这里查。然后就根据自己的matlab/python版本安装相应的python/matlab版本。
- 然后开始install。注意R20222b之后的matlab才可以直接用pip安装,其他版本都要用setup.py安装。pip的没有试过,就不说了,直接说明用setup.py安装的情况。按照下面步骤做
- 在matlab的terminal中输入
matlab
,获取matlab的安装路径 - 在Linux系统的terminal输入
cd matlabroot/extern/engines/python
进入这个文件夹 - 下一步,如果直接输入
python setup.py install
的话就会在默认的python环境的site-packages中创建一个matlab package的文件夹,例如matlabengineforpython-R2020b-py3.8.egg。你可以通过在python的terminal输入>>> import sys
>>> sys.path
看到这个文件夹的路径。这就说明默认的python环境中安装好了这个matlab package。这里我们一直在强调默认的python环境,但是如果你有很多个由conda管理的python环境的话,你就要先进入目标python环境,再运行install。
- 在matlab的terminal中输入
到这里看似很顺利,但真正的bug才开始……
注意,直接运行python setup.py install
是需要管理员权限的,也就是说你作为一个普通用户就需要sudo python setup.py install
,然后输入密码,这是在你有管理员权限的情况下,这里我们假设你有。如此一来,bug的是默认的python环境也会因为sudo而变成root的默认python环境,与你有没有进入自己想安装matlab的python环境没有关系了。这点可以通过运行sudo python setup.py install
之后终端的输出看出来,你会看到大概意思是matlab package的相关内容被写进了root的默认python环境中的语句。
这里我就卡了好久,最后终于发现了一个巧妙的办法。
我们先activate到目标python环境,然后su,切换成root账号,这样再在terminal输入python,就会发现,竟然还是我们的目标python环境,这样就非常nice了。这样一来,我们只需要继续运行python setup.py install
就可以顺利地将matlab下载到目标python环境中了。🎉
然后我就开心地去试了一下import matlab.engine
,结果……出现了下面的error:
……/Home/matlab/matlab/bin/glnxa64/../../sys/os/glnxa64/libstdc++.so.6: undefined symbol: __cxa_thread_atexit_impl
前面就省略了哈,反正你就是出现了’__cxa_thread_atexit_impl’这个关键词😭。最后经过一番搜索,终于让我发现了解决方法,在这里。具体为啥出error我也没懂,反正照着上面链接里面的做就顺利解决了。差不多就是下面几个步骤:
- 还是像前面一样先找到matlabroot路径
- 然后在terminal输入
ls matlabroot/bin/glnxa64/glibc-*
,记住这个输出,比如说是matlabroot/bin/glnxa64/glibc-2.17_shim.so
- 然后在terminal输入echo $0
- 如果输出结果是csh/tcsh,就在terminal
setenv LD_PRELOAD matlabroot/bin/glnxa64/glibc-2.17_shim.so
- 如果输出结果是bash,就在terminal
export LD_PRELOAD=matlabroot/bin/glnxa64/glibc-2.17_shim.so
- 如果输出结果是csh/tcsh,就在terminal
现在终于可以了,再去import matlab.engine
就没有问题啦!