matlab.engine 配置

用python调用matlab

Posted by yunnd on November 22, 2022

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。

到这里看似很顺利,但真正的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

现在终于可以了,再去import matlab.engine就没有问题啦!