Модуль Python не может загрузить разделяемую библиотеку, Причина: изображение не найдено - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь использовать модуль Python Houdini, который поставляется с приложением и является частью установочной папки 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, причем Current является символической ссылкой16.5.571.

Модуль Python

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

Модуль Python найден.

Общие библиотеки

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

Содержит ссылку на @rpath/Houdini.framework/Versions/16.5.571/Houdini, которую он предположительно пытается найти.

Houdini

Похоже, что это ссылка на фактические dylib файлы, содержащие @loader_path/Libraries иdylib...@rpath/libHoudiniUI и т. Д. И многие другие.

Я читал здесь Не удается найти динамическую библиотеку при запуске скрипта Python из Bazel , что SIP может вызывать его, но даже после ln -s общих библиотекв /usr/local/lib ошибка все еще произошла.

Я использую pyenv, но попробовал с системной средой Python, что привело к тому же поведению.

Есть предложения?

1 Ответ

0 голосов
/ 28 сентября 2018

Ответ в dyld: библиотека не загружена ... Причина: изображение не загружено указал мне правильное направление, предлагая переписать пути динамической библиотеки, используя 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

Может быть лучше использовать относительный путь.

...