2016-10-07 23 views
2

Вот что у меня есть:Альтернатива для DYLD_LIBRARY_PATH-трик, поскольку Mac OS 10.11 El Capitan с системой защиты целостности

  • Mac OS 10.11 El Capitan
  • питон 2.7.12, установленная из питона. орг под /Library/Frameworks/Python.framework/
  • PyCharm 2016.2.3
  • ВТК 7.1.0

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

  • Построить модуль питона локально. В моем случае это 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 в место, где 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 в питона консоли 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 
    

К настоящему времени, я понимаю, что проблема вызвана System Integrity Protection (SIP), который был введен в El Capitan. Одним из эффектов является то, что дочерние процессы имеют только restricted access для других ресурсов, и, скорее всего, 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 не является вариантом. По-видимому, он помогает копировать dylib в текущий рабочий каталог, но для меня это невозможно. Однако размещение libs в местоположении сайта (vtk) не помогает.

Я уверен, что многие люди полагаются на DYLD_LIBRARY_PATH -hack и теперь борются с последствиями SIP - вот почему я думал, что сообщество может извлечь выгоду из этого довольно продолжительного вопроса.

ответ

1

После долгой борьбы я смог решить последнюю часть моей проблемы.

Установив фиксированное значение для RPATH Run-Path dependent Libraries установленных двоичных файлов, мои проблемы с привязкой исчезли.

Существуют разные возможности для достижения этой цели. Я предполагаю, что один из вариантов - использовать install_name_tool. Для меня проще всего было построить vtk с соответствующими флагами CMake. Вот мой обновленный призыв к cmake, где CMAKE_MACOSX_RPATH и CMAKE_INSTALL_RPATH сделать разницу:

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" \ 
       -DCMAKE_MACOSX_RPATH=ON \ 
       -DCMAKE_INSTALL_RPATH="/opt/dev/versions/vtk/vtk-7.1.0-shared/lib" \ 
       -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" 

Читать here больше об обработке RPATH CMake в. Обратите внимание, что otool -L vtkCommonCorePython.so (для примера) все равно будет писать @rpath на выходе, но значение по-прежнему фиксировано.

@rpath/libvtkCommonCorePython27D-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0) 
@rpath/libvtkWrappingPython27Core-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0) 
/Library/Frameworks/Python.framework/Versions/2.7/Python (compatibility version 2.7.0, current version 2.7.0) 
@rpath/libvtksys-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0) 
@rpath/libvtkCommonCore-7.1.1.dylib (compatibility version 0.0.0, current version 0.0.0) 
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0) 
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1) 
+0

Похожие посты на пользователя ВТК рассылки, которая также может представлять интерес: [(Post 1)] (http://vtk.1045678.n5.nabble.com/How-to-build-and-install- the-python-wrapper-правильно-на-rootless-MacOS-10-11-td5740708.html) и [(сообщение 2)] (http://vtk.1045678.n5.nabble.com/VTK-and-Python- on-OS-X-El-Capitan-td5734265.html) – normanius

+0

Прочитайте, возможно, также [this] (https://stackoverflow.com/a/47699417/3388962) иллюминативный ответ, связанный с этой темой. – normanius