Вот что у меня есть:
- Mac OS 10.11 Эль-Капитан
- python 2.7.12, установленный с python.org под
/Library/Frameworks/Python.framework/
- PyCharm 2016.2.3
- vtk 7.1.0
Вот что я делаю:
Соберите модуль Python локально. В моем случае это vtk. Краткое описание см. В вызове CMake, с помощью которого я настраиваю vtk.
cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release -DVTK_WRAP_PYTHON=ON -DBUILD_EXAMPLES=OFF -DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=OFF -DCMAKE_INSTALL_PREFIX="/opt/dev/versions/vtk/vtk-7.1.0-shared" -DPYTHON_INCLUDE_DIR="/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/" -DPYTHON_LIBRARY="/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.dylib"
Установите пакет python в том месте, где он может быть найден. В моем случае это
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages
. Обратите внимание, что я должен расширитьDYLD_LIBRARY_PATH
на место, где находятся библиотеки:/opt/dev/versions/vtk/vtk-7.1.0-shared/lib/
.Если я запускаю python с терминала, я могу успешно импортировать vtk.
import vtk v = vtk.vtkVersion() print v.GetVTKVersion()
Если я попытаюсь импортировать vtk в консоль Python PyCharm, я получаю следующую ошибку:
Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2881, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-2-b7e11aadda62>", line 1, in <module> import vtk File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_bundle/pydev_import_hook.py", line 21, in do_import module = self._system_import(name, *args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vtk/__init__.py", line 41, in <module> from .vtkCommonCore import * File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_bundle/pydev_import_hook.py", line 21, in do_import module = self._system_import(name, *args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/vtk/vtkCommonCore.py", line 9, in <module> from vtkCommonCorePython import * File "/Applications/PyCharm.app/Contents/helpers/pydev/_pydev_bundle/pydev_import_hook.py", line 21, in do_import module = self._system_import(name, *args, **kwargs) ImportError: No module named vtkCommonCorePython
На данный момент я понимаю, что проблема вызвана Защитой целостности системы (SIP), которая была введен в Эль-Капитан. Одним из эффектов является то, что дочерние процессы имеют только ограничения. доступ к другим ресурсам, и, скорее всего, PyCharm выполняет python как отдельный процесс.
Я также понимаю, что python не может импортировать vtk, потому что он не может найти dylib, на которые ссылается модуль python. Я могу проверить это двумя способами:
DYLD_LIBRARY_PATH
пуст. Это потому, что python работает как дочерний процесс в PyCharm:os.getenv('DYLD_LIBRARY_PATH')
возвращаетNone
.- Когда я копирую все библиотеки из
/opt/dev/versions/vtk/vtk-7.1.0-shared/lib/
в текущий рабочий каталог, я могу импортировать модуль
Теперь вопрос: очевидно, DYLD_LIBRARY_PATH
не может использоваться в дочерних процессах и, следовательно, больше не должен использоваться с El Capitan. Итак, как правильно заменить этот «хакерский прием», который отлично работал до MacOS 10.11? Есть ли способ по-прежнему использовать DYLD_LIBRARY_PATH
?
Отключение SIP не вариант. Судя по всему, это помогает скопировать дилибы в текущий рабочий каталог, но для меня это неосуществимо. Однако размещение библиотек в местоположении пакета сайта (vtk) не помогает.
Я почти уверен, что многие люди полагались на DYLD_LIBRARY_PATH
-hack и теперь борются с последствиями SIP - вот почему я подумал, что сообщество может извлечь выгоду из этого довольно длинного вопроса.
defaults write ~/.MacOSX/environment DYLD_LIBRARY_PATH $DYLD_LIBRARY_PATH
- person Dave   schedule 02.02.2019