IDL-Python 网桥因 OSX El Capitan 上的 SIP 而失败

IDL-Python bridge fails due to SIP on OSX El Capitan

我正在尝试在 OSX El Capitan 10.11.5 上使用 IDL 8.5.1 中的新 IDL-Python 桥。我在 Windows 上使用了此功能,因为它启动后效果很好,但它在 OSX.

上根本不起作用

我已经安装了 Anaconda Python 3.4.1 64bit 来测试。

按照 here 所述设置环境后,其中涉及设置 DYLD_LIBRARY_PATH 环境变量。

我可以从 Python 调用 IDL,但反过来不行。例如,如果我 运行 以下命令(来自示例 here),则会观察到以下错误:

IDL> ran = Python.Import('numpy.random')
% DLM_LOAD: Error loading sharable executable.
            Symbol: IDL_Load, File = /Applications/exelis/idl85/bin/bin.darwin.x86_64/idl_python34.so
            dlopen(/Applications/exelis/idl85/bin/bin.darwin.x86_64/idl_python34.so, 1): Library not loaded: libpython3.4m.dylib
              Referenced from: /Applications/exelis/idl85/bin/bin.darwin.x86_64/idl_python34.so
              Reason: image not found
% Execution halted at: $MAIN$

在与他们的技术支持合作后(我不得不说,他们非常乐于助人而且他们的帮助质量很高)我们确定问题是由新的系统完整性保护 (SIP) 功能引起的OSX。此问题已在 上描述过。

他们的建议是禁用 SIP,但我没有得到雇主的许可,也不愿意为了让一个商业软件工作而关闭系统安全功能。所以我卡住了。

本质上,DYLD_LIBRARY_PATH 变量不会传递给 IDL 进程。当启动 IDL 时,/Applications/exelis/idl85/bin/idl shell 脚本被执行,此时变量被删除了我所做的任何修改,而 idl 脚本根本不知道我的更改。

那么我的问题是:有没有其他人找到替代方法(除了禁用 SIP)来让 IDL-Python 网桥工作?这里有其他选择吗?还是在 Harris Geospatial 的优秀人员找到另一种方法来实现此功能之前,这根本行不通?

我认为这是一个严重的设计问题,如果它需要在根级别修改系统只是为了 运行 他们的软件。

好的,我们目前正在研究如何更轻松地让 IDL-Python 桥在 El Capitan 上工作。同时,您可以按照以下步骤使其正常工作。 首先,确保您的路径设置正确。例如,在您的 .login 文件(不是 .cshrc)中:

setenv PATH /Users/username/anaconda/bin:${PATH}
setenv PYTHONHOME /Users/username/anaconda
setenv PYTHONPATH /Users/username/Applications/exelis/idl/bin/bin.darwin.x86_64
setenv PYTHONPATH ${PYTHONPATH}:/Users/username/Applications/exelis/idl85/lib/bridges

然后,对于 IDL-to-Python 桥,运行 以下命令:

cd Applications/exelis/idl85/bin/bin.darwin.x86_64/
sudo install_name_tool -change libpython3.4m.dylib /Users/username/anaconda/lib/libpython3.4m.dylib idl_python34.so

你可以使用这个命令来验证:

otool -L idl_python34.so

对于 Python-to-IDL 桥(其中一些是从上面复制的):

cd Applications/exelis/idl85/bin/bin.darwin.x86_64/
sudo install_name_tool -change libidl.8.5.dylib @loader_path/libidl.8.5.dylib pythonidl34.so
sudo install_name_tool -change libidl_ips.8.5.dylib @loader_path/libidl_ips.8.5.dylib pythonidl34.so
sudo install_name_tool -change libpython3.4m.dylib /Users/username/anaconda/lib/libpython3.4m.dylib pythonidl34.so

此时.login中还需要DYLD_LIBRARY_PATH指定IDL的bin目录。为了消除这种情况,可以进行以下更新以告诉各种库在哪里可以找到它们的依赖项:

sudo install_name_tool -change libMesaGL6_2.dylib @loader_path/libMesaGL6_2.dylib libidl.8.5.dylib
sudo install_name_tool -change libMesaGLU6_2.dylib @loader_path/libMesaGLU6_2.dylib libidl.8.5.dylib
sudo install_name_tool -change libOSMesa6_2.dylib @loader_path/libOSMesa6_2.dylib libidl.8.5.dylib
sudo install_name_tool -change libXm.3.0.2.dylib @loader_path/libXm.3.0.2.dylib libidl.8.5.dylib
sudo install_name_tool -change libMesaGL6_2.dylib @loader_path/libMesaGL6_2.dylib libMesaGLU6_2.dylib
sudo install_name_tool -change libMesaGL6_2.dylib @loader_path/libMesaGL6_2.dylib libOSMesa6_2.dylib
sudo install_name_tool -change libidl.8.5.dylib @loader_path/libidl.8.5.dylib libidl_ips.8.5.dylib

希望对您有所帮助!