使用 KivyMD 和 Pyinstaller 导入错误

Posted

技术标签:

【中文标题】使用 KivyMD 和 Pyinstaller 导入错误【英文标题】:Import error using KivyMD and Pyinstaller 【发布时间】:2017-09-30 04:56:39 【问题描述】:

当我尝试将 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,有什么建议吗?谢谢!

【问题讨论】:

Cx_Freeze cannot find pkg_resources/*.*'的可能重复 混合斜线的效果大概和***.com/questions/42609043/…一样 您能否将您的应用程序缩减为minimal reproducible example?要么是文件没有被包含,要么是执行逻辑没有找到它,可能是由于混合斜线。 【参考方案1】:

pyinstaller 中没有 kivymd 的钩子,它无法识别包,因此会出现导入错误。所以你可以做的是为pyinstaller写一个小钩子,以便在打包时可以识别它。

也许尝试使用我的 sn-p。在 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 中创建这个文件就可以了。

【讨论】:

欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.【参考方案2】:

由于 KivyMD 0.102.1 存在 PyInstaller 钩子。您可以在 .spec 文件中指定 KivyMD 的挂钩目录:

from kivymd import hooks_path as kivymd_hooks_path

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

您可以查看Kitchen Sink's pyinstaller.spec file 和example in KivyMD's documentation 了解如何使用此挂钩。


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

【讨论】:

【参考方案3】: 使用pip install auto-py-to-exe 运行auto-py-to-exe(在cmd中) 在auto-py-exe ui 中选择其他选项 在附加文件中,添加从站点包复制的 kivymd 文件夹 (auto -py-exe(ui))

【讨论】:

以上是关于使用 KivyMD 和 Pyinstaller 导入错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 PyInstaller 挂钩的 KivyMD - 图像未显示在独立 .exe 中

python3 PyQt5 pyinstaller 打包太大,打包完40M。引用的库写在下面,求大神看怎再能精简一下!!

使用pyinstaller打包python小程序(没有使用第三方模块)

KivyMD - 如何使用 KivyMD BottomNavigationItems 和屏幕本身内的按钮在屏幕上导航?

尝试使用 KivyMD 和 Python 显示 PDF 文件

KivyMD - ScreenManager 和 ids