【问题标题】:IDL-Python bridge fails due to SIP on OSX El Capitan由于 OSX El Capitan 上的 SIP,IDL-Python 桥接失败
【发布时间】:2016-07-19 21:22:00
【问题描述】:

我正在尝试在 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 的优秀人员找到另一种实现此功能的方法之前,这将根本不起作用?

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

【问题讨论】:

    标签: python macos idl-programming-language


    【解决方案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-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 到 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
    

    希望这会有所帮助!

    【讨论】:

    • 谢谢克里斯,非常感谢您的帮助。我无法尝试上面列出的步骤,因为在我现在的雇主,用户(包括我自己)没有 sudo 权限。
    • 嗨@spacemanjosh,试试不带“sudo”的命令。如果您在自己的 Applications 文件夹中安装了 IDL,那么它将正常工作。如果没有“sudo”就无法使用,您需要让管理员来完成。
    • 嘿@chris-torrence。我应该说,我是这个功能的忠实粉丝。它在 linux 和 windows 上运行得非常好。 Mac 似乎是唯一存在此问题的平台。我已经使用最新的 IDL 8.6 进行了尝试,并且设置要容易得多,但是,存在对 sudo 权限的相同要求。现在我只是在一个 linux VM 中进行测试以完成任务。
    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 2016-05-08
    • 2016-01-09
    • 2016-02-16
    • 2016-10-29
    • 2017-01-14
    相关资源
    最近更新 更多