我正试图在OSX El Capitan 10.11.5上的IDL 8.5.1中使用新的IDL Python桥。自从它推出以来,我一直在Windows上使用这个功能,它运行得很好,但在OSX上根本不起作用。
我已经安装了Anaconda Python 3.4.164位进行测试。
按照此处所述设置环境之后,包括设置DYLD_LIBRARY_PATH
环境变量。
我可以从Python中调用IDL,但不能反过来。例如,如果我运行以下命令(来自这里的示例),则会观察到以下错误:
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的好心人找到另一种实现这一功能的方法之前,这根本不起作用吗?
在我看来,这是一个严重的设计问题,如果它需要在根级别修改系统来运行他们的软件。
好的,我们目前正在研究如何更容易地让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到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
希望这能有所帮助!