#python #importerror #sdl-2 #dylib #py2app
#питон #ошибка импорта #sdl-2 #дылиб #py2app
Вопрос:
Я создаю небольшую игру, похожую на roguelike, с https://github.com/libtcod/python-tcod и он работает нормально, когда я запускаю «main.py » файл с использованием моего интерпретатора Python.
Итак, я хотел поделиться своим маленьким творением с другими людьми. Проблема в том, что когда я пытаюсь создать приложение с помощью py2app (https://py2app.readthedocs.io/en/latest /) приложение выходит из строя при запуске.
Это полная трассировка ошибки:
roguelike git:(build-mac) ./dist/main.app/Contents/MacOS/main
Traceback (most recent call last):
File "/Users/username/PycharmProjects/roguelike/dist/main.app/Contents/Resources/__boot__.py", line 101, in <module>
_run()
File "/Users/username/PycharmProjects/roguelike/dist/main.app/Contents/Resources/__boot__.py", line 84, in _run
exec(compile(source, path, "exec"), globals(), globals())
File "/Users/username/PycharmProjects/roguelike/dist/main.app/Contents/Resources/main.py", line 4, in <module>
import tcod
File "<frozen zipimport>", line 259, in load_module
File "tcod/__init__.pyc", line 18, in <module>
File "<frozen zipimport>", line 259, in load_module
File "tcod/loader.pyc", line 111, in <module>
File "<frozen zipimport>", line 259, in load_module
File "tcod/_libtcod.pyc", line 14, in <module>
File "tcod/_libtcod.pyc", line 10, in __load
File "imp.pyc", line 342, in load_dynamic
ImportError: dlopen(/Users/username/PycharmProjects/roguelike/dist/main.app/Contents/Resources/lib/python3.8/lib-dynload/tcod/_libtcod.so, 2): Library not loaded: @loader_path/.dylibs/SDL2
Referenced from: /Users/username/PycharmProjects/roguelike/dist/main.app/Contents/Resources/lib/python3.8/lib-dynload/tcod/_libtcod.so
Reason: image not found
2020-11-29 18:04:37.832 main[21123:2360673] main Error
Я думаю, что проблема здесь:
Библиотека не загружена: @loader_path/.dylibs/ SDL2
Но я не уверен, как проверить, к какому пути относится «@loader_path», и как это исправить, чтобы мое «приложение» можно было запускать на любом Mac. В идеале я хотел бы, чтобы мое приложение использовало SDL2, который упакован в main.app/Contents/Frameworks / SDL2
Комментарии:
1. Из
man dyld
: «Эта переменная заменяется путем к каталогу, содержащему двоичный файл mach-o, который содержит команду загрузки с помощью@loader_path
. Таким образом, в каждом двоичном@loader_path
файле разрешается другой путь, […]». Похоже, что в вашем случае это было бы/Users/username/PycharmProjects/roguelike/dist/main.app/Contents/Resources/lib/python3.8/lib-dynload/tcod
. Возможно, вы также захотите проверитьman install_name_tool
.2. Спасибо за понимание. Теперь это работает, после перемещения SDL2 из фреймворков в путь загрузчика
cp dist/main.app/Contents/Frameworks/SDL2 dist/main.app/Contents/Resources/lib/python3.8/lib-dynload/tcod/.dylibs
, но я все еще не понимаю, зачем это нужно.