【问题标题】:Matlab Engine Python - OSx Anaconda Segfault or DYLD_LIBRARY_PATH error with iPythonMatlab 引擎 Python - iPython 的 OSx Anaconda Segfault 或 DYLD_LIBRARY_PATH 错误
【发布时间】:2015-08-09 20:56:24
【问题描述】:

在终端中安装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_PATH 来解决这个问题,之后 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

如您所见,python 版本不同。我认为这是我的系统 Python 和 Anaconda 之间的冲突,但我不确定如何解决它,非常感谢任何帮助。 谢谢。

【问题讨论】:

  • 我遇到了类似的问题 - 您找到解决方案了吗?
  • 我发现这个类似的问题有一个解决方案 - 还没有尝试过。 stackoverflow.com/questions/33357739/….
  • 会检查一下谢谢!
  • 不,没有找到解决方案,所以如果它确实有效,请告诉我!
  • 我为此头疼不已,因为即使在设置 DYLD_LIBRARY_PATH 之后它也不起作用。问题是我使用的是 iPython 而不是普通的 Python (2.7),所以一旦我使用了 matlab.engine 就可以了。然而,后来发生的一个问题是 matlab.engine 的行为不是很好。如果嵌套函数在另一个文件夹中,则使用嵌套函数调用函数不起作用,并且它也找不到某些内置函数。现在,我刚刚编写了一个 matlab 脚本,它可以满足我从 matlab 中的需要,并通过 Pyhton 中的子进程运行它。

标签: python macos matlab anaconda matlab-engine


【解决方案1】:

您需要使用 conda 命令行安装实用程序安装库,而不是 python。 conda help searchconda help install 应该会让你继续前进。

【讨论】:

  • 进一步解释:在命令行使用python可能是激活了内置的OSX Python。
【解决方案2】:

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

这就是我所做的

  1. 编写了一个 Matlab 主脚本,它可以满足我对 Matlab 的所有需求。
  2. 通过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 文件中。

【讨论】:

    【解决方案3】:

    在我的情况下,向 LD_LIBRARY_PATH(Ubuntu 的 DYLD_LIBRARY_PATH 版本)添加内容只会让事情变得更糟。相反,我必须确保它没有引用 Python 安装,并且必须从 /usr/lib 添加一个符号链接。见https://stackoverflow.com/a/45161288/2524427

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多