使用 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 和屏幕本身内的按钮在屏幕上导航?