Запуск движка 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 ответ
Краткий ответ: было две проблемы, которые нужно было решить
$LD_LIBRARY_PATH
не должен содержать путь к установке Anaconda. Добавление такого пути не рекомендуется в соответствии с документацией conda: https://conda.io/docs/building/shared-libraries.html, но некоторые пакеты могут сделать это в любом случае, что приведет к ошибке сегментации.- Символическая ссылка необходима из файла 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 какие-либо ссылки на среду Anacondaecho $LD_LIBRARY_PATH
, Если это так, убедитесь, что он больше не делает:export LD_LIBRARY_PATH=only_paths_you_do_want_to_keep_separated_by_a_colon
, Это действие экспорта необходимо повторять всякий раз, когда вы активируете свою среду Anaconda, поэтому вы можете захотеть найти более постоянные способы ее настройки. Тем не менее, в моем случае (помимо того, что я сам добавлял его в надежде, что это улучшит ситуацию) путь был фактически добавлен pygpu, поэтому я в итоге сбросил LD_LIBRARY_PATH из моего скрипта на python (пока не замечая побочных эффектов),