Ошибка импорта с использованием KivyMD и Pyinstaller
Когда я пытаюсь использовать pyinstaller с 'KivyMD Kitchen Sink' (--one file --debug --clean), я получаю это:
File "kivymd\theming.py", line 17, in <module>
File "site-packages\kivy\core\text\__init__.py", line 248, in register
# and pass it in context.config token
OSError: File C:\Users\username\AppData\Local\Temp\_MEI92522\kivymd\fonts/Roboto-Regular.ttfs not found
Failed to execute script main
Я пытаюсь использовать:
if hasattr(sys, '_MEIPASS'):
os.chdir(sys._MEIPASS)
в main.py но ничего не изменилось.
Кроме того, я скопировал Roboto-Regular.ttf в каталог main.exe без успеха.
Pyinstaller хорошо работает с другими приложениями Kivy.
ОБНОВИТЬ:
Я нашел временное решение. Я использовал Pyinstaller's --onedir
команда с main.py вместо main.spec файла:
wine pyinstaller --onedir main.py
Затем я скопировал папку kivymd (../site-packages/kivyMD) в папку моего приложения, и приложение запустилось без ошибок.
В любом случае, я хотел бы заморозить приложение как --onefile
Есть предложения? Спасибо!
1 ответ
Начиная с KivyMD 0.102.1 есть перехватчик PyInstaller. Вы можете просто указать каталог хуков KivyMD в вашем файле.spec:
from kivymd import hooks_path as kivymd_hooks_path
a = Analysis(
# ...
hookspath=[kivymd_hooks_path],
# ...
)
Вы можете увидеть файл pyinstaller.spec Kitchen Sink и пример в документации KivyMD о том, как использовать этот крючок.
Полный файл pyinstaller.spec будет:
# -*- mode: python ; coding: utf-8 -*-
import sys
import os
from kivy_deps import sdl2, glew
from kivymd import hooks_path as kivymd_hooks_path
path = os.path.abspath(".")
a = Analysis(
["main.py"],
pathex=[path],
hookspath=[kivymd_hooks_path],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=None,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=None)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
debug=False,
strip=False,
upx=True,
name="app_name",
console=False,
)
В pyinstaller нет хука для kivymd, он не распознает пакет и, следовательно, приведет к ошибкам импорта. Итак, вы можете написать небольшой хук для pyinstaller, чтобы его можно было распознать во время упаковки.
Возможно, попробуйте использовать мой фрагмент. Проверено на Windows 10
from PyInstaller.utils.hooks import (
collect_data_files,
copy_metadata,
collect_submodules
)
datas = copy_metadata('kivymd')
hiddenimports = collect_submodules('kivymd')
datas = collect_data_files('kivymd')
Ссылка на хук PyInstaller https://bitbucket.org/snippets/eiNjel/RgdLkG
Создайте этот файл в pyinstaller / hooks, и все будет в порядке.
- использовать
pip install auto-py-to-exe
- бежать
auto-py-to-exe
(в cmd) - выберите дополнительную опцию в
auto-py-exe
ui - в дополнительном файле добавьте папку kivymd, скопированную из пакета сайта (
auto -py-exe(ui)
)