Alternative für den DYLD_LIBRARY_PATH-Trick seit Mac OS 10.11 El Capitan mit Systemintegritätsschutz

Hier ist was ich habe:

Mac OS 10.11 El Capitanpython 2.7.12, installiert von python.org unter/Library/Frameworks/Python.framework/PyCharm 2016.2.3vtk 7.1.0

Hier ist was ich tue:

Erstelle lokal ein Python-Modul. In meinem Fall ist dies vtk. Eine Zusammenfassung finden Sie im CMake-Aufruf, mit dem ich vtk konfiguriere.

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"

Installieren Sie das Python-Paket an einem Ort, an dem Python es finden kann. In meinem Fall ist dies/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages Beachten Sie, dass ich das @ verlängern muDYLD_LIBRARY_PATH durch den Ort, an dem sich die Bibliotheken befinden:/opt/dev/versions/vtk/vtk-7.1.0-shared/lib/.

Wenn ich Python vom Terminal aus starte, kann ich vtk erfolgreich importieren.

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

Wenn ich versuche, vtk in die Python-Konsole von PyCharm zu importieren, wird die folgende Fehlermeldung angezeigt:

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

Bis jetzt verstehe ich, dass das Problem durch die @ verursacht wiSystemintegritätsschutz (SIP), das in El Capitan eingeführt wurde. Einer der Effekte ist, dass untergeordnete Prozesse nur @ habeeingeschränkter Zugan zu anderen Ressourcen und höchstwahrscheinlich führt PyCharm Python als separaten Prozess aus.

Ich verstehe auch, dass Python vtk nicht importieren kann, da es die Dylibs, mit denen das Python-Modul verknüpft ist, nicht finden kann. Ich kann dies auf zwei Arten überprüfen:

DasDYLD_LIBRARY_PATH ist leer. Dies liegt daran, dass Python in PyCharm als untergeordneter Prozess ausgeführt wird:os.getenv('DYLD_LIBRARY_PATH') kehrt zurückNone.Wenn ich alle Bibliotheken von @ kopie/opt/dev/versions/vtk/vtk-7.1.0-shared/lib/ in das aktuelle Arbeitsverzeichnis kann ich das Modul importieren

Jetzt die Frage: Offenbar,DYLD_LIBRARY_PATH kann nicht in Child-Prozessen verwendet werden und sollte daher seit El Capitan überhaupt nicht mehr verwendet werden. Also, wie man diesen "Linkage Hack", der vor MacOS 10.11 einwandfrei funktionierte, richtig ersetzt? Gibt es eine Möglichkeit, @ noch zu verwendeDYLD_LIBRARY_PATH?

Deaktivieren von SIP ist keine Option. Anscheinend hilft es, die Dylibs in das aktuelle Arbeitsverzeichnis zu kopieren, aber das ist für mich nicht machbar. Das Platzieren der Bibliotheken in der Site-Package-Position (von vtk) hilft jedoch nicht.

Ich bin mir ziemlich sicher, dass sich viele Leute auf das @ verlassen habeDYLD_LIBRARY_PATH -hack und jetzt mit den Konsequenzen von SIP kämpfen - deshalb dachte ich, dass die Community von dieser recht langen Frage profitieren könnte.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage