簡體   English   中英

使用KivyMD和Pyinstaller導入報錯

[英]Import error using KivyMD and 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 的--onedir命令與 main.py 一起使用,而不是 main.spec 文件:

wine pyinstaller --onedir main.py

然后,我將 kivymd 文件夾 (../site-packages/kivyMD) 復制到我的應用程序文件夾,應用程序啟動時沒有錯誤。

無論如何,我想將應用程序凍結為--onefile ,有什么建議嗎? 謝謝!

由於KivyMD 0.102.1有 PyInstaller 掛鈎。 您可以在 .spec 文件中指定 KivyMD 的掛鈎目錄:

from kivymd import hooks_path as kivymd_hooks_path

a = Analysis(
    # ...
    hookspath=[kivymd_hooks_path],
    # ...
)

您可以在 KivyMD 的文檔中查看Kitchen Sink 的 pyinstaller.spec 文件示例,了解如何使用此掛鈎。


完整的 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) )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM