Запуск движка Matlab в виртуальной среде anaconda возвращает "Ошибка сегментации (ядро сброшено)"

Я установил официальный движок MATLAB, следуя инструкциям из ответа Anaconda об установке Matlab Engine на Linux в виртуальной среде Anaconda, работающей на Python3.5. Теперь я могу импортировать matlab а также matlab.engine без получения ошибок. Тем не менее, когда я пытаюсь:matlab.engine.start_matlab()Я получаю 'Ошибка сегментации (ядро сброшено)'

Я попытался установить LD_LIBRARY_PATH из среды conda (на случай, если это даже уместно): 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

Итак, как я могу запустить механизм Matlab / вызвать сценарии Matlab из Python из виртуальной среды Anaconda?

Я на Ubuntu, кстати

1 ответ

Решение

Краткий ответ: было две проблемы, которые нужно было решить

  1. $LD_LIBRARY_PATH не должен содержать путь к установке Anaconda. Добавление такого пути не рекомендуется в соответствии с документацией conda: https://conda.io/docs/building/shared-libraries.html, но некоторые пакеты могут сделать это в любом случае, что приведет к ошибке сегментации.
  2. Символическая ссылка необходима из файла libpythonXXX.dylib правильной версии в /usr/lib/, чтобы MATLAB мог найти правильный Python

Длинный ответ: полная инструкция по установке для использования MATLAB Engine с Anaconda

  • Установите версию MATLAB, которая поддерживает Python, который вы хотите использовать. Убедитесь, что эта конкретная установка MATLAB активирована
  • Откройте терминал и перейдите в папку, содержащую движок Python установки MATLAB: 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", На этом этапе вы должны быть в состоянии import matlab а также matlab.engine изнутри Python вашей среды Anaconda, но, в моем случае, запуск двигателя дал ошибку сегментации.
  • Найдите файл 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-версии этого файла на / usr / lib: sudo ln -s /your_path_to_anaconda3/envs/your_env/lib/libpython3.5m.dylib /usr/lib, Обратите внимание, что в / usr / lib может быть только одна ссылка с именем libpython3.5m.dylib. Таким образом, если у вас есть несколько сред Anaconda, использующих одну и ту же версию Python, вам нужно только один раз установить эту ссылку на какую-либо из них. Помните, что не следует удалять эту среду, так как это нарушит связь для всех других сред, полагающихся на нее.
  • Запустите новый терминал (!) И активируйте среду 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, поэтому я в итоге сбросил LD_LIBRARY_PATH из моего скрипта на python (пока не замечая побочных эффектов),
Другие вопросы по тегам