Приложение PyInstalled Kivy не запускается на второй машине - PullRequest
0 голосов
/ 12 января 2019

Я упаковываю приложение 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

Ожидаемым результатом будет то, что один создаваемый исполняемый файл будет работать на любой подобной машине без ошибок или без необходимости во всей папке дополнительных файлов.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 12 января 2019

В разделе COLLECT вашего .spec файла указано, что будет создан исполняемый файл onedir. Чтобы сделать исполняемый файл onefile, вам необходимо удалить раздел COLLECT. Кроме того, sdl2 и glew deps, перечисленные в разделе COLLECT, можно добавить в раздел EXE как *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)] вместо значения по умолчанию [],, которое появляется перед первым аргументом ключевого слова.

Также обратите внимание, что большинство параметров командной строки Pyinstaller игнорируются, если вы используете файл .spec. Обратитесь к документации для получения более подробной информации. К сожалению, документация Pyinstaller во многих местах довольно расплывчата.

...