Python 模块无法加载共享库,原因:找不到图像

Python module cannot load shared library, Reason: image not found

我正在尝试使用应用程序附带的 Houdini Python 模块,它是 Houdini 安装文件夹的一部分,位于标准 Python 路径之外。按照安装说明进行操作后,运行 Houdini Terminal 16.5.571 脚本并将 /Applications/Houdini/Houdini16.5.571/Frameworks/Houdini.framework/Versions/Current/Resources/houdini/python2.7libs 添加到 _virtualenv_path_extensions.pth 在我的 site-packages 文件夹中hou 模块可以导入,即 Python 部分。但是它无法加载动态库。

错误信息

Traceback (most recent call last):

File "myscript.py", line 7, in <module>
    import hou
  File "/Applications/Houdini/Houdini16.5.571/Frameworks/Houdini.framework/Versions/Current/Resources/houdini/python2.7libs/hou.py", line 19, in <module>
    import _hou
ImportError: dlopen(/Applications/Houdini/Houdini16.5.571/Frameworks/Houdini.framework/Versions/Current/Resources/houdini/python2.7libs/_hou.so, 2): Library not loaded: @rpath/Houdini.framework/Versions/16.5.571/Houdini
  Referenced from: /Applications/Houdini/Houdini16.5.571/Frameworks/Houdini.framework/Versions/Current/Resources/houdini/python2.7libs/_hou.so
  Reason: image not found

错误消息中提到的所有文件和文件夹都位于 Houdini 路径 /Applications/Houdini/Houdini16.5.571/Frameworks/Houdini.framework/Versions/Current 中,其中 Current16.5.571 的符号link。

Python模块

Resources/houdini/python2.7libs/hou.py

找到 Python 模块。

共享库

Resources/houdini/python2.7libs/_hou.so`

这包含对 @rpath/Houdini.framework/Versions/16.5.571/Houdini 的引用,它可能正在尝试查找。

Houdini

这似乎 link 到实际的 dylib 文件,包含 @loader_path/Librariesdylib...@rpath/libHoudiniUI 等以及许多其他文件。

我在这里读到 可能是 SIP 引起的,但即使在 ln -s 共享库进入 /usr/local/lib 之后,错误仍然发生。

我正在使用 pyenv 但尝试使用系统 Python 环境,导致相同的行为。

有什么建议吗?

dyld: Library not loaded ... Reason: Image not loaded 中的答案为我指明了正确的方向,建议使用 otool 重写动态库路径。

列出 _hou.so 加载的所有库,显示以下列表,其中 @rpath/Houdini.framework/Versions/16.5.571/Houdini 是导致问题的库。

otool -L /Applications/Houdini/Houdini16.5.571/Frameworks/Houdini.framework/Versions/Current/Resources/houdini/python2.7libs/_hou.so
/Applications/Houdini/Houdini16.5.571/Frameworks/Houdini.framework/Versions/Current/Resources/houdini/python2.7libs/_hou.so:
    @rpath/Houdini.framework/Versions/16.5.571/Houdini (compatibility version 1.0.0, current version 16.5.255)
    /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1443.14.0)
    /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.0.0)
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 22.0.0)
    /System/Library/Frameworks/QTKit.framework/Versions/A/QTKit (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL (compatibility version 1.0.0, current version 1.0.0)
    /System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 492.0.0)
    /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.0)

可以使用install_name_tool -change重写路径。

install_name_tool -change @rpath/Houdini.framework/Versions/16.5.571/Houdini /Applications/Houdini/Houdini16.5.571/Frameworks/Houdini.framework/Versions/16.5.571/Houdini /Applications/Houdini/Houdini16.5.571/Frameworks/Houdini.framework/Versions/Current/Resources/houdini/python2.7libs/_hou.so

使用相对路径可能更好。