在 anaconda 虚拟环境中启动 Matlab 引擎 returns 'Segmentation fault (core dumped)'

Starting Matlab engine in anaconda virtual environment returns 'Segmentation fault (core dumped)'

我已经按照 的答案中的说明将官方 MATLAB 引擎安装到 Anaconda 虚拟环境 运行 Python3.5。我现在可以导入 matlabmatlab.engine 而不会收到错误。但是,当我尝试时: matlab.engine.start_matlab(),我得到 'Segmentation fault (core dumped)'

我尝试在 conda 环境中设置 LD_LIBRARY_PATH(以防相关):export LD_LIBRARY_PATH=/System/Library/Frameworks/Python.framework/Versions/Current/lib:$LD_LIBRARY_PATH,但无济于事。据我所知,该路径也不存在,所以我也尝试了 export DYLD_LIBRARY_PATH=path_to_anaconda3/envs/myEnv/lib:$LD_LIBRARY_PATH

那么如何在 Anaconda 虚拟环境中从 Python 启动 matlab engine/call Matlab 脚本?

我在Ubuntu,顺便说一句

简答:有两个问题需要解决

  1. $LD_LIBRARY_PATH 应该 而不是 包含 Anaconda 安装路径。根据 conda 文档,不鼓励添加这样的路径:https://conda.io/docs/building/shared-libraries.html,但某些包可能会这样做,导致分段错误。
  2. 需要一个符号link从正确版本的libpythonXXX.dylib文件到/usr/lib/,这样MATLAB才能找到正确的Python

长答案:将 MATLAB 引擎与 Anaconda 一起使用的完整安装说明

  • 安装支持您要使用的 Python 的 MATLAB 版本。确保此特定 MATLAB 安装已激活
  • 打开终端并转到包含 MATLAB 安装的 Python 引擎的文件夹:cd "/usr/local/MATLAB/R2017a/extern/engines/python"
  • 运行 setup.py 加上您想使用的 Python 版本,并在 Anaconda 环境位置前缀:sudo python3.5 setup.py install --prefix="/your_path_to_anaconda3/envs/your_env"。此时,您应该能够从 Anaconda 环境的 Python 中 import matlabmatlab.engine,但是,在我的例子中,启动引擎给出了分段错误。
  • 找到正确版本的libpython文件。您的 Anaconda 环境应该包含它:find /your_path_to_anaconda3/envs/your_env/ -name libpython*。在我的例子中,这返回了:
    • /.../lib/libpython3.so
    • /.../lib/python3.5/config-3.5m/libpython3.5m.a
    • /.../lib/libpython3.5m.so.1.0
    • /.../lib/libpython3.5m.so
  • 因为我想在 python 3.5 中使用它,所以我使用了 libpython3.5m(我不知道为什么 'm' 在那里)。从该文件的 .dylib 版本创建一个符号 link 到 /usr/lib:sudo ln -s /your_path_to_anaconda3/envs/your_env/lib/libpython3.5m.dylib /usr/lib。请注意,在 /usr/lib 中只能有一个名为 libpython3.5m.dylib 的 link。因此,如果您有多个 Anaconda 环境使用相同版本的 Python,则只需将此 link 设置一次即可。但是请记住不要删除此环境,因为这会破坏依赖它的所有其他环境的 link。
  • 启动一个新终端 (!) 并激活您的 Anaconda 环境:source activate your_env。在您的 Anaconda 环境中检查 LD_LIBRARY_PATH 是否包含对 Anaconda 环境 echo $LD_LIBRARY_PATH 的任何引用。如果是这样,请确保它不再这样做:export LD_LIBRARY_PATH=only_paths_you_do_want_to_keep_separated_by_a_colon。每当您激活 Anaconda 环境时都需要重复此导出操作,因此您可能需要研究更永久的设置方法。然而,在我的例子中(除了我自己添加它希望这会改善事情之外)路径实际上是由 pygpu 添加的,所以我最终从我的 python 脚本中重置了 LD_LIBRARY_PATH (到目前为止没有注意到不良影响)。