在 anaconda 虚拟环境中启动 Matlab 引擎 returns 'Segmentation fault (core dumped)'
Starting Matlab engine in anaconda virtual environment returns 'Segmentation fault (core dumped)'
我已经按照 的答案中的说明将官方 MATLAB 引擎安装到 Anaconda 虚拟环境 运行 Python3.5。我现在可以导入 matlab
和 matlab.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,顺便说一句
简答:有两个问题需要解决
$LD_LIBRARY_PATH
应该 而不是 包含 Anaconda 安装路径。根据 conda 文档,不鼓励添加这样的路径:https://conda.io/docs/building/shared-libraries.html,但某些包可能会这样做,导致分段错误。
- 需要一个符号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 matlab
和 matlab.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 (到目前为止没有注意到不良影响)。
我已经按照 matlab
和 matlab.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,顺便说一句
简答:有两个问题需要解决
$LD_LIBRARY_PATH
应该 而不是 包含 Anaconda 安装路径。根据 conda 文档,不鼓励添加这样的路径:https://conda.io/docs/building/shared-libraries.html,但某些包可能会这样做,导致分段错误。- 需要一个符号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 matlab
和matlab.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 (到目前为止没有注意到不良影响)。