Ошибка импорта с использованием 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))
Другие вопросы по тегам