Matlab引擎Python-OSx Anaconda Segfault或DYLD_库_路径错误与iPython

Matlab引擎Python-OSx Anaconda Segfault或DYLD_库_路径错误与iPython,python,macos,matlab,anaconda,matlab-engine,Python,Macos,Matlab,Anaconda,Matlab Engine,在终端中安装matlab python包后,使用: cd "matlabroot\extern\engines\python" python setup.py install 试着运行它,我得到一个错误: :~$ python Python 2.7.10 |Anaconda 2.3.0 (x86_64)| (default, May 28 2015, 17:04:42) [GCC 4.2.1 (Apple Inc. build 5577)] on darwin Type "help", "c

在终端中安装matlab python包后,使用:

cd "matlabroot\extern\engines\python"
python setup.py install
试着运行它,我得到一个错误:

:~$ python
Python 2.7.10 |Anaconda 2.3.0 (x86_64)| (default, May 28 2015, 17:04:42) 
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://binstar.org
>>> import matlab.engine
Segmentation fault: 11
但是,我可以通过设置DYLD_LIBRARY_路径来解决这个问题,matlab.engine在该路径下工作:

:~$ export DYLD_LIBRARY_PATH=/System/Library/Frameworks/Python.framework/Versions/Current/lib:$DYLD_LIBRARY_PATH
:~$ python
Python 2.7.6 (default, Sep  9 2014, 15:04:36) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import matlab.engine
>>> eng = matlab.engine.start_matlab()
>>> exit()
但是,当我尝试在之后启动iPython时,会出现以下错误:

Traceback (most recent call last):
  File "//anaconda/bin/ipython", line 4, in <module>
    from IPython import start_ipython
  File "//anaconda/lib/python2.7/site-packages/IPython/__init__.py", line 45, in <module>
    from .config.loader import Config
  File "//anaconda/lib/python2.7/site-packages/IPython/config/__init__.py", line 6, in <module>
    from .application import *
  File "//anaconda/lib/python2.7/site-packages/IPython/config/application.py", line 19, in <module>
    from IPython.config.configurable import SingletonConfigurable
  File "//anaconda/lib/python2.7/site-packages/IPython/config/configurable.py", line 12, in <module>
    from .loader import Config, LazyConfigValue
  File "//anaconda/lib/python2.7/site-packages/IPython/config/loader.py", line 16, in <module>
    from IPython.utils.path import filefind, get_ipython_dir
  File "//anaconda/lib/python2.7/site-packages/IPython/utils/path.py", line 14, in <module>
    import tempfile
  File "//anaconda/lib/python2.7/tempfile.py", line 32, in <module>
    import io as _io
  File "//anaconda/lib/python2.7/io.py", line 51, in <module>
    import _io
ImportError: dlopen(//anaconda/lib/python2.7/lib-dynload/_io.so, 2): Symbol not found: __PyErr_ReplaceException
  Referenced from: //anaconda/lib/python2.7/lib-dynload/_io.so
  Expected in: dynamic lookup
回溯(最近一次呼叫最后一次):
文件“//anaconda/bin/ipython”,第4行,在
从IPython导入开始\u IPython
文件“//anaconda/lib/python2.7/site packages/IPython/_init__.py”,第45行,在
从.config.loader导入配置
文件“//anaconda/lib/python2.7/site packages/IPython/config/_init__.py”,第6行,在
从.应用程序导入*
文件“//anaconda/lib/python2.7/site packages/IPython/config/application.py”,第19行,在
从IPython.config.configurable导入SingletonConfigurable
文件“//anaconda/lib/python2.7/site packages/IPython/config/configurable.py”,第12行,在
从.loader导入配置,LazyConfigValue
文件“//anaconda/lib/python2.7/site packages/IPython/config/loader.py”,第16行,在
从IPython.utils.path导入文件find,获取\u IPython\u dir
文件“//anaconda/lib/python2.7/site packages/IPython/utils/path.py”,第14行,在
导入临时文件
文件“//anaconda/lib/python2.7/tempfile.py”,第32行,在
将io作为_io导入
文件“//anaconda/lib/python2.7/io.py”,第51行,在
导入
ImportError:dlopen(//anaconda/lib/python2.7/lib-dynload//\u io.so,2):未找到符号:\u PyErr\u ReplaceException
参考自://anaconda/lib/python2.7/lib-dynload//u io.so
应为:动态查找
正如您所看到的,python版本是不同的。我认为这是我的系统Python和Anaconda之间的冲突,但我不确定如何修复它,非常感谢任何帮助。
谢谢。

您需要使用conda命令行安装实用程序而不是python来安装库
conda help search
conda help install
应该可以帮助您进行操作。

这不是一个直接的解决方案,但我遇到了相同的问题,并使用了此解决方法。我应该说,我终于让
matlab.engine
在我的Python环境中运行了,但它真的很糟糕。它无法在其他文件夹中运行嵌入脚本的脚本,而且我还体验到它找不到一些内置函数。下面是为Unix机器实现的,但我相信,要使其在Windows中工作,不需要太多修改

以下是我所做的

  • 编写了一个主Matlab脚本,可以从Matlab中完成我所需要的一切
  • 通过Python中的子进程运行该脚本
  • 在我的例子中,我需要对矩阵X和返回矩阵S执行一系列矩阵运算。矩阵运算需要使用特定的Matlab函数。我的第一个想法是用
    Matlab.engine
    打开一个Matlab会话,然后在Python中管理矩阵操作,只在需要时调用Matlab函数。相反(如项目符号所述),我编写了一个Matlab函数
    ComputeSimilarityMat
    ,它接受X,执行所有必要的操作,并返回S。然后,我基本上只是使用一个子流程从Python运行那个Matlab函数

    这就是通过子流程管理Matlab脚本的Python脚本的样子:

    import subprocess
    import numpy as np
    
    def run_matlab(X):
        """Produce trait-similarity matrix S from a trait-space matrix X
    
        Parameters
        ----------
        X : numpy.ndarray
    
        Returns
        -------
        S : numpy.ndarray
        """
    
        # Dump input in .csv, so Matlab can load it
        np.savetxt('X.csv', X, delimiter=",")
    
        # Code executed in Matlab. Important to end with quit;
        matlab_code = "X=csvread('X.csv');" \
                      "S=ComputeSimilarityMat(X);" \
                      "csvwrite('S.csv',S);" \
                      "quit;"
    
        # -nosplash suppresses the splash window on startup
        matlab_call = ["matlab", "-nodesktop", "-nosplash", "-r", matlab_code]
        subprocess.call(matlab_call)
    
        # Load the .csv file that Matlab dumps after finishing
        S = np.genfromtxt('X.csv', delimiter=",")
    
        return S
    
    我必须说,我相信有一种更好的方法可以将对象传递到Matlab,然后像这样保存和加载,但它对我很有效。仍然希望matlab.engine的改进,但在此之前,我将采用这种方法

    注意:要从命令行/子流程运行Matlab,需要将Matlab bin文件夹添加到PATH变量中,如下所示:

    export PATH="/Applications/MATLAB_R2015a.app/bin:$PATH"
    

    我只是把它放在我的.profile文件中。

    在我的例子中,将东西添加到LD_LIBRARY_PATH(Ubuntu版本的DYLD_LIBRARY_PATH)只会让事情变得更糟。相反,我必须确保它没有引用Python安装,而是添加了一个来自/usr/lib的符号链接。请参见

    进一步的解释:在命令行上使用python可能会激活内置的OSX python。我遇到了类似的问题-您找到解决方案了吗?我找到了一个类似的问题-还没有尝试过。我会查出来的谢谢!没有,没有找到解决方案,所以如果它真的有效,请让我知道!我当时正为此头痛不已,因为即使在设置了DYLD_LIBRARY_路径之后,它也不起作用。问题是我使用的是iPython,而不是普通的Python(2.7),所以一旦我使用了matlab.engine,它实际上就工作了。然而,后来出现的一个问题是matlab.engine的性能不是很好。如果嵌套函数位于另一个文件夹中,则使用嵌套函数调用函数无效,并且无法找到某些内置函数。现在,我刚刚编写了一个matlab脚本,它完成了我从matlab中需要的功能,我用Pyhton的一个子进程来运行它。