Включить файлы.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.