Alternativa para o truque DYLD_LIBRARY_PATH desde o Mac OS 10.11 El Capitan com proteção de integridade do sistema

Aqui está o que eu tenho:

Mac OS 10.11 El Capitanpython 2.7.12, instalado a partir de python.org em/Library/Frameworks/Python.framework/PyCharm 2016.2.3vtk 7.1.0

Aqui está o que eu faço:

Crie um módulo python localmente. No meu caso, isso évtk. Para um resumo, consulte a chamada do CMake com a qual eu configuro o 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"

Instale o pacote python em um local onde o python possa encontrá-lo. No meu caso, isso é/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages Observe que sou obrigado a estender oDYLD_LIBRARY_PATH pelo local em que as bibliotecas residem:/opt/dev/versions/vtk/vtk-7.1.0-shared/lib/.

Se eu iniciar o python a partir do terminal, posso importar o vtk com sucesso.

import vtk
v = vtk.vtkVersion()
print v.GetVTKVersion()

Se eu tentar importar o vtk no console python do PyCharm, obtenho o seguinte erro:

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

Até agora, eu entendo que o problema é causado peloProteção de Integridade do Sistema (SIP) que foi introduzido em El Capitan. Um dos efeitos é que os processos filhos apenas têmacesso restrito para outros recursos e, provavelmente, o PyCharm executa o python como um processo separado.

Eu também entendo que o python não pode importar o vtk porque não consegue encontrar os dylibs aos quais o módulo python está vinculado. Eu posso verificar isso de duas maneiras:

oDYLD_LIBRARY_PATH está vazia. Isso ocorre porque o python é executado como um processo filho no PyCharm:os.getenv('DYLD_LIBRARY_PATH') retornaNone.Quando copio todas as bibliotecas de/opt/dev/versions/vtk/vtk-7.1.0-shared/lib/ para o diretório de trabalho atual, posso importar o módulo

Agora a pergunta: Pelo visto,DYLD_LIBRARY_PATH não pode ser usado em processos filhos e, portanto, não deve mais ser usado desde El Capitan. Então, como substituir corretamente esse "linkage hack" que funcionava perfeitamente antes do MacOS 10.11.? Existe uma maneira de ainda usarDYLD_LIBRARY_PATH?

Desabilitar o SIP não é uma opção. Aparentemente, ajuda copiar os dylibs para o diretório de trabalho atual, mas isso não é viável para mim. A colocação das bibliotecas no local do pacote do site (do vtk) não ajuda no entanto.

Tenho certeza de que muitas pessoas têm contado com aDYLD_LIBRARY_PATH-hack e agora lute com as conseqüências do SIP - é por isso que pensei que a comunidade poderia se beneficiar dessa pergunta bastante longa.

questionAnswers(1)

yourAnswerToTheQuestion