ModuleNotFoundError:当 pyinstaller 创建的 EXE 运行 plyer.filechooser.open_file() 和 Choose_dir() 时,没有名为“plyer.platforms”的模块

问题描述 投票:0回答:4

我的带有 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')
kivy pyinstaller
4个回答
1
投票

我也遇到同样的问题

我的解决方法是在使用 pyinstaller 创建 exe 时添加以下参数

--hidden-import plyer.platforms.win.notification

1
投票

将以下隐藏导入添加到规范文件

a = Analysis(
   ...
   hiddenimports=['plyer.platforms.win.filechooser'],
   ...

0
投票

要解决这个问题:

第 1 步:转到您的规范文件并添加

a = 分析( ... hiddenimports=['plyer.platforms.win.notification'], ...

第2步:创建exe时,在终端中加入: pyinstaller --onefile main.py --hidden-import plyer.platforms.win.notification

然后繁荣!!


-1
投票

问题是由于缺少隐藏导入引起的。尝试包含“特定于平台的模块”,就像 brsaylorWindows 通知中所做的那样 - NotImplementedError:找不到可用的实现!第485章

https://github.com/kivy/plyer/issues/485#issuecomment-457880444

我在 Macos 上的 FileChooser 上遇到了类似的问题,我通过将特定于平台的模块添加到规范文件中的

hiddenimports
来解决它。对于这个问题,更改将类似于:

a = Analysis(
   ...
   hiddenimports=['plyer.platforms.win.notification'],
   ...
© www.soinside.com 2019 - 2024. All rights reserved.