我的带有 kivy GUI 的 python 脚本可以在 Pycharm 或 Spyder IDE 中顺利运行。使用 pyinstaller 创建 EXE (Windows) 后,EXE 可以在出现 GUI 的情况下运行,没有任何问题。但是,当我单击运行
plyer.filechooser.open_file()
或 plyer.filechooser.choose_dir()
的按钮时,会出现此错误:
Traceback (most recent call last):
File "plyer\utils.py", line 96, in _ensure_obj
ModuleNotFoundError: No module named 'plyer.platforms'
[INFO ] [Base ] Leaving application in progress...
我刚刚意识到 pyinstaller 在“dist”目录下创建的输出目录包含我的脚本中使用的包,例如 pandas、numpy、pyexcelerate 等,但不包含 plyer。这很奇怪,因为我的脚本在开头明确有
import plyer
。
我的 pyinstaller 规范文件如下所示。我使用 plyer 来选择文件的原因是它的尺寸很小,而 PyQt5 会创建巨大的 EXE 尺寸,而 kivy FileChooser 不会显示用户计算机中可用的所有硬盘驱动器(如果有人知道这个问题的解决方案那就太好了)。
import os
from os.path import join
from kivy import kivy_data_dir
from kivy.deps import sdl2, glew
from kivy.tools.packaging import pyinstaller_hooks as hooks
block_cipher = None
kivy_deps_all = hooks.get_deps_all()
kivy_factory_modules = hooks.get_factory_modules()
# list of data filepath (your *.kv, image files, kivymd files) to copy to the output directory
datas = [('./gui.kv', '.'),
('./venv/Lib/site-packages/kivymd', 'kivymd')
]
# list of modules to exclude from Analysis
excludes_a = ['Tkinter', '_tkinter', 'twisted', 'docutils', 'pygments']
# list of hiddenimports
hiddenimports = kivy_deps_all['hiddenimports'] + kivy_factory_modules
# binary data
sdl2_bin_tocs = [Tree(p) for p in sdl2.dep_bins]
glew_bin_tocs = [Tree(p) for p in glew.dep_bins]
bin_tocs = sdl2_bin_tocs + glew_bin_tocs
# assets
kivy_assets_toc = Tree(kivy_data_dir, prefix=join('kivy_install', 'data'))
# source_assets_toc = Tree("images", prefix="images")
# assets_toc = [kivy_assets_toc, source_assets_toc]
assets_toc = [kivy_assets_toc]
tocs = bin_tocs + assets_toc
a = Analysis(['main.py'],
pathex=[os.getcwd()],
binaries=None,
datas=datas,
hiddenimports=hiddenimports,
hookspath=[],
runtime_hooks=[],
excludes=excludes_a,
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe1 = EXE(pyz,
a.scripts,
name='main', # name of output *.exe file
exclude_binaries=True,
# icon=join('images', 'mywinapp.ico'),
debug=False,
strip=False,
upx=True,
console=True) # set to console-based, NOT window-based.
coll = COLLECT(exe1,
a.binaries,
a.zipfiles,
a.datas,
*tocs,
strip=False,
upx=True,
name='Parser')
我也遇到同样的问题
我的解决方法是在使用 pyinstaller 创建 exe 时添加以下参数
--hidden-import plyer.platforms.win.notification
将以下隐藏导入添加到规范文件
a = Analysis(
...
hiddenimports=['plyer.platforms.win.filechooser'],
...
要解决这个问题:
第 1 步:转到您的规范文件并添加
a = 分析( ... hiddenimports=['plyer.platforms.win.notification'], ...
第2步:创建exe时,在终端中加入: pyinstaller --onefile main.py --hidden-import plyer.platforms.win.notification
然后繁荣!!
问题是由于缺少隐藏导入引起的。尝试包含“特定于平台的模块”,就像 brsaylor 在 Windows 通知中所做的那样 - NotImplementedError:找不到可用的实现!第485章 :
https://github.com/kivy/plyer/issues/485#issuecomment-457880444
我在 Macos 上的 FileChooser 上遇到了类似的问题,我通过将特定于平台的模块添加到规范文件中的
来解决它。对于这个问题,更改将类似于:hiddenimports
a = Analysis( ... hiddenimports=['plyer.platforms.win.notification'], ...