#python #linker #macos-catalina #py2app #dyld
#python #компоновщик #macos-catalina #py2app #dyld
Вопрос:
Итак, я пытаюсь использовать Py2app для экспорта скрипта python, который использует tkinter и записывает в Excel, и я получаю эту ошибку;
ImportError: dlopen(/Users/James/Documents/Python/Projects/Budget/dist/automating_finances0.app/Contents/Resources/lib/python3.8/lib-dynload/PIL/_imaging.so, 2):
Library not loaded: @loader_path/.dylibs/libopenjp2.2.3.1.dylib
Referenced from: /Users/James/Documents/Python/Projects/Budget/dist/automating_finances0.app/Contents/Resources/lib/python3.8/lib-dynload/PIL/_imaging.so
Reason: image not found
Когда я otool -L
включаю contents/macOS/automating_finances0
, я получаю это;
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 21.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 283.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1151.16.0)
Я исследовал @loader_path, @rpath и ссылки на dyld, но, похоже, не могу понять это. Я не уверен, почему мое приложение ищет зависимости в папках выше, а не myapp/contents/frameworks etc
в том, где libopenjp2.2.3.1.dylib
находится? Я попытался изменить пути поиска, выполнив;
install_name_tool -change /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa Users/James/Documents/Python/Projects/Budget/dist/automating_finances0.app/Contents/frameworks Users/James/Documents/Python/Projects/Budget/dist/automating_finances0.app/Contents/macOS/automating_finances0
но это абсолютно не работает, я не совсем уверен, что такое Cocoa? Новичок, поэтому любая помощь очень ценится.
Ответ №1:
Оказывается, я искал не в том месте, ошибка была с _imaging.so . Я не учел это, потому что не распознал файл .so как динамическую библиотеку. Использование otool -L _imaging.so
показало отсутствующие зависимости и bingo, которые они включали libopenjp2.2.3.1.dylib
в себя среди прочих. В итоге я просто скопировал содержимое myapp/contents/frameworks
to usr/local/lib
, которое, похоже, работает нормально, хотя это не похоже на надежное решение.