由于OSX El Capitan上的SIP,IDL-Python桥接器失败

时间:2016-07-19 21:22:01

标签: python macos idl-programming-language

我正在尝试在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$

在使用他们的技术支持后(我必须说,他们非常有帮助并且他们的帮助质量很高)我们确定问题是由OSX中新的系统完整性保护(SIP)功能引起的。此问题已在stack之前描述过。

他们的建议是禁用SIP,但我既没有获得雇主的许可,也没有意愿关闭系统安全功能只是为了让一件商业软件能够运行。因此我被卡住了。

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

我的问题是:是否有其他人找到了另一种方法(除了禁用SIP)以使IDL-Python桥工作?这里有其他选择吗?或者,在Harris Geospatial的优秀人员找到另一种方法来实现此功能之前,这是否会起作用?

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

1 个答案:

答案 0 :(得分:1)

好的,我们正在研究如何更轻松地让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到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

希望这有帮助!