Matlab Engine Python - OSx Anaconda Segfault или ошибка DYLD_LIBRARY_PATH с iPython

После установки пакета matlab python в терминал с помощью:

cd "matlabroot\extern\engines\python"
python setup.py install

И пытаясь запустить его, я получаю segfault:

:~$ 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, но я не уверен, как это исправить, любая помощь очень ценится. Спасибо.


person InterwebIsGreat    schedule 09.08.2015    source источник
comment
У меня похожая проблема - вы нашли решение?   -  person Ulf Aslak    schedule 16.02.2016
comment
Я нашел этот похожий вопрос с решением - еще не пробовал. stackoverflow.com/questions/33357739/.   -  person InterwebIsGreat    schedule 16.02.2016
comment
Проверим спасибо!   -  person Ulf Aslak    schedule 16.02.2016
comment
И нет, не нашел решения, поэтому, если оно работает, дайте мне знать!   -  person InterwebIsGreat    schedule 17.02.2016
comment
Я бился головой об стену по этому поводу, потому что это не сработало даже после установки DYLD_LIBRARY_PATH. Проблема заключалась в том, что я использовал iPython, а не обычный Python (2.7), поэтому, как только я это сделал, matlab.engine действительно заработал. Однако возникшая позже проблема заключалась в том, что matlab.engine ведет себя не очень хорошо. Вызов функции с вложенной функцией не работал, если вложенные функции находились в другой папке, а также не мог найти некоторые встроенные функции. Теперь я только что написал один скрипт Matlab, который делает то, что мне нужно от Matlab, и запускаю его через подпроцесс в Pyhton.   -  person Ulf Aslak    schedule 18.02.2016


Ответы (3)


Вам нужно установить библиотеки, используя утилиту установки командной строки conda, а не python. conda help search и conda help install помогут вам.

person bikemule    schedule 09.08.2015
comment
Дальнейшее объяснение: использование python в командной строке, вероятно, активирует встроенный в OSX Python. - person bikemule; 10.08.2015

Это не прямое решение, но я столкнулся с той же проблемой и использовал этот обходной путь. И я должен сказать, что я наконец-то заставил matlab.engine работать в своей среде Python, но это был просто отстой. Он не мог запускать сценарии со встроенными сценариями в других папках, и я также столкнулся с тем, что он не мог найти некоторые встроенные функции. Следующее реализовано для машины Unix, но, я думаю, не потребуется много изменений, чтобы заставить его работать в Windows.

Вот что я сделал:

  1. Написал основной сценарий Matlab, который мог делать все, что мне было нужно от Matlab.
  2. Запустите этот скрипт через подпроцесс в Python.

В моем случае мне нужно было выполнить серию матричных операций для матрицы X и вернуть матрицу S. Матричные операции требовали использования определенной функции Matlab. Моя первая идея заключалась в том, чтобы открыть сеанс Matlab с помощью matlab.engine, а затем управлять матричными операциями в Python, вызывая только функцию Matlab при необходимости. Вместо этого (как указано в пулях) я написал функцию Matlab ComputeSimilarityMat, которая принимает X, выполняет все необходимые операции и возвращает S. Затем я просто запустил эту функцию Matlab из Python, используя подпроцесс.

Вот как выглядит скрипт Python, который управляет скриптом Matlab через подпроцесс:

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 из командной строки/подпроцесса, вам нужно добавить папку bin Matlab в переменную PATH следующим образом:

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

Я просто поместил это в свой файл .profile.

person Ulf Aslak    schedule 18.02.2016

В моем случае добавление вещей в LD_LIBRARY_PATH (версия DYLD_LIBRARY_PATH для Ubuntu) только ухудшило ситуацию. Вместо этого мне пришлось убедиться, что это не относится к установке Python, и вместо этого пришлось добавить символическую ссылку из /usr/lib. См. https://stackoverflow.com/a/45161288/2524427.

person 5Ke    schedule 18.07.2017