Включить файлы.kv/.json при упаковке файлов в PyInstaller --onefile?

У меня очень простое приложение (просто окно с меткой), и я пытаюсь пройти через процесс превращения в один исполняемый файл. Вот каталог программ:

brainfreeze/
   main.py # simple app
   main.kv # kv language style sheet
   config/
      settings.json # json settings panel data (F1 bound)
saving_to/
   (empty at start)

Я успешно использовал PyInstaller, чтобы скомпилировать программу в исполняемый файл, но только с использованием метода одного комплекта папок, описанного в их документах; Я пытаюсь использовать метод одного файла пакета вместо этого. До сих пор, когда я компилирую, приложение запускается, но его черный экран (традиционно я видел это, когда main.kv не может быть загружен). Я читал это, это, это и даже документы PyInstaller, но мне не повезло в успешной компиляции в один исполняемый файл. Вот prog_test.spec:

# -*- mode: python -*-

from kivy.deps import sdl2
from kivy.deps import glew

block_cipher = None

a = Analysis(['..\\brainfreeze\\main.py'],
             pathex=['H:\\TestBed\\single_exe_test'],
             binaries=[],
             data=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)

a.datas += [('../brainfreeze/main.kv', 'DATA'), ('../brainfreeze/config/settings.json', 'DATA')]

exe = EXE(pyz, Tree('../brainfreeze/'),
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
          name='prog_test',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True)

Мне любопытно, если это a.datas добавление метода вызывает проблемы, так как все примеры имеют 3 индекса, в то время как документация имеет только 2 индекса. Моя последовательность команд следующая:

# from the 'saving to' directory
python -m PyInstaller --onefile --name prog_test ../brainfreeze/main.py
# alter the prog_test.spec to the above
python -m PyInstaller --onefile prog_test.spec

Что я делаю неправильно, чтобы включить поддержку (.kv, .json) файлы?

1 ответ

У меня также была эта проблема с очень простым примером, и я также прочитал те же статьи, которые вы упомянули. Точно так же мое приложение работало, когда оно упаковано в папку, но не в один исполняемый файл. Я переместил класс приложения kivy в отдельный файл.py, чтобы основной файл выглядел примерно так:

import os, sys
from kivy.resources import resource_add_path, resource_find
from myApp import AppClass

if __name__ == '__main__':
    if hasattr(sys, '_MEIPASS'):
        resource_add_path(os.path.join(sys._MEIPASS))

    app = AppClass()
    app.run()

Myapp.kv был добавлен в файл спецификации в качестве данных. И это сработало для меня. Я подозреваю, что путь к ресурсам kivy должен сначала добавить каталог meipass перед импортом любых других пакетов kivy в сценарий python.

Другие вопросы по тегам