сборка игры в формате libtcod с помощью py2app «Библиотека не загружена: @loader_path/.dylibs/ SDL2»

#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 , но я все еще не понимаю, зачем это нужно.