Я упаковываю приложение Kivy, используя PyInstaller (3.4) для использования на машинах Windows. Я получил его для компиляции и работы на моей машине, но при перемещении исполняемого файла на другой, он не дает ошибку:
[WARNING] [Image ] Unable to load image
C:\Users\<OTHER_MACHINES_USER>\AppData\Local\Temp_MEI38442\kivy_install\data\glsl\default.png>
[CRITICAL] [Window ] Unable to find any valuable Window provider.
sdl2 - Exception: SDL2: Unable to load image
Это работает из папки dist
, когда все копируется (как в ./dist/client_iface.exe
), и поэтому я считаю, что это проблема зависимости, которую мне не удалось решить, по-видимому, с SDL2.
Я полагаю, что эта проблема почти идентична этой проблеме , однако этому вопросу уже два года, и пока он не имеет успешного решения.
Я следовал ряду руководств (включая этот , который связан с приведенным выше сообщением), но безуспешно.
Файл спецификации с настройками согласно справочнику Kivy выглядит следующим образом:
# -*- mode: python -*-
from kivy.deps import sdl2, glew
import os
block_cipher = None
a = Analysis(
['client_iface.py'],
pathex=['D:\\Users\\<USER>\\Documents\\2_Projects\\py_dice_roller\\client'],
binaries=[('D:\\Users\\<USER>\\Documents\\2_Projects\\DnD\\py_dice_roller\\client\\SDL2.dll', '.')],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False
)
a.datas += [
('client_iface.kv', '.\\client_iface.kv', 'DATA'),
('active.png', '.\\images\\active.png', 'DATA'),
('back.png', '.\\images\\active.png', 'DATA'),
('normal.png', '.\\images\\active.png', 'DATA'),
('DroidSansMono.ttf', '.\\fonts\\DroidSansMono.ttf', 'DATA')
]
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher
)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='client_iface',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True,
icon='.\images\icon_dWU_icon.ico',
)
coll = COLLECT(
exe, Tree(os.getcwd()),
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
strip=False,
upx=True,
name='client_iface'
)
И, следуя вышеупомянутой ссылке, я включил в скрипт следующий код:
def resourcePath(path):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS)
return os.path.join(os.path.abspath(path))
if __name__ == '__main__':
kivy.resources.resource_add_path(resourcePath('.'))
kivy.resources.resource_add_path(resourcePath('./images'))
main_app().run()
И моя команда используется:
python -m PyInstaller -F --onefile .\client_iface.spec
Ожидаемым результатом будет то, что один создаваемый исполняемый файл будет работать на любой подобной машине без ошибок или без необходимости во всей папке дополнительных файлов.
Любая помощь будет оценена.