PyInstaller: как использовать файлы, которые находятся внутри .exe
У меня имеется вот такая структура файлов:
Папка sounds
Папка images
settings.json
coordinates.json
lib.py (основной скрипт)
Для того, что бы создать .exe файл, я использую такую команду:
pyinstaller --add-data sounds;sounds --add-data images;images --add-data coordinates.json;. --add-data settings.json;. --hidden-import pynput.keyboard._win32 --hidden-import pynput.mouse._win32 --onefile lib.py
(--hidden-import'ы необходимы, ибо без них не работает импорт модуля pynput)
Однако после запуска .exe выдается ошибка, что файла settings.json не существует. Но если закинуть этот файл в папку уже с exe'шником, то все срабатывает.
Та же самая история с файлом coordinates.json и файлами в папках sounds и images (вместо звуков проигрывается стандартный звук ошибки windows, а изображения просто не находятся).
Вопрос: можно ли, и если да, то как читать/воиспроизводить/изменять файлы, находящиеся внутри .exe?
Если же изменять их нельзя, то как можно создать что-то ввиде загрузчика? То есть создать папку где-нибудь в appdata и туда загрузить эти файлы. (Имеется ввиду все это сделать должен скрипт).
Заранее благодраю, С уважением.
Ответы (1 шт):
Как оказалось, все гениально и не очень - просто.
В самой документации PyInstaller все описано. А именно: при запуске exe'шника все внутренности программы распаковываюся во временную папку windows. Соответсвенно, в скрипте нужно обращаться к ним. Вот как это нужно сделать (код из официально документации):
def resource_path(relative_path):
# Получаем абсолютный путь к ресурсам.
try:
# PyInstaller создает временную папку в _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
А далее использовать эту функцию везде, где мы указываем путь к файлам, которые должны будут лежать в exe'шнике. Например:
path_to_the_images = resourse_path('images')