使用 pyinstaller 时没有名为 kivymd.effects 的模块

Posted

技术标签:

【中文标题】使用 pyinstaller 时没有名为 kivymd.effects 的模块【英文标题】:No module named kivymd.effects when using pyinstaller 【发布时间】:2021-11-23 21:59:46 【问题描述】:

嗨,任何人都可以帮忙解决这个问题,当我尝试运行它时,我的 exe 文件抛出了这个错误,并且我在 main.spec 文件中将 kivymd 添加到了我的 hiddenimports=["kivymd"] 中,我也尝试安装kivymd 使用 pip 但仍然抛出错误。

    Traceback (most recent call last):
  File "kivy\lang\parser.py", line 472, in execute_directives
ModuleNotFoundError: No module named 'kivymd.effects'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "kivy\lang\parser.py", line 474, in execute_directives
ModuleNotFoundError: No module named 'kivymd.effects'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 28, in <module>
    from kivymd.uix.datatables import MDDataTable
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "PyInstaller\loader\pyimod03_importers.py", line 546, in exec_module
  File "kivymd\uix\datatables.py", line 307, in <module>
  File "kivy\lang\builder.py", line 373, in load_string
  File "kivy\lang\parser.py", line 402, in __init__
  File "kivy\lang\parser.py", line 508, in parse
  File "kivy\lang\parser.py", line 485, in execute_directives
kivy.lang.parser.ParserException: Parser: File "<inline>", line 3:
...
      1:
      2:#:import DEVICE_TYPE kivymd.material_resources.DEVICE_TYPE
>>    3:#:import StiffScrollEffect kivymd.effects.stiffscroll.StiffScrollEffect
      4:
      5:
...
Unable to import package 'kivymd.effects.stiffscroll.StiffScrollEffect'

【问题讨论】:

【参考方案1】:

我为同样的问题苦苦挣扎了几天,所以这里是解决方法。

pyinstaller 没有导入效果模块,因为它不包含在 kivymd 钩子列表(kivymd_hooks_path)中,所以您需要手动添加它:

首先转到 ...\AppData\Local\Programs\Python\Python38\Lib\site-packages\kivymd (或任何您的 kivymd 路径并修改 __init__.py 以添加效果路径:

原文:

....

path = os.path.dirname(__file__)
"""Path to KivyMD package directory."""

fonts_path = os.path.join(path, f"fontsos.sep")
"""Path to fonts directory."""

images_path = os.path.join(path, f"imagesos.sep")
"""Path to images directory."""

...

修改:

....

    path = os.path.dirname(__file__)
    """Path to KivyMD package directory."""
    
    fonts_path = os.path.join(path, f"fontsos.sep")
    """Path to fonts directory."""
    
    images_path = os.path.join(path, f"imagesos.sep")
    """Path to images directory."""
    
    effects_path = os.path.join(path, f"effectsos.sep")
    """Path to effects directory."""

...

第二次转到 ...\kivymd\tools\packaging\pyinstaller 并修改 hook-kivymd.py 并添加效果路径:

datas = [
    (
        kivymd.fonts_path,
        str(Path("kivymd").joinpath(Path(kivymd.fonts_path).name)),
    ),
    (
        kivymd.images_path,
        str(Path("kivymd").joinpath(Path(kivymd.images_path).name)),
    ),
    (
        kivymd.effects_path,
        str(Path("kivymd").joinpath(Path(kivymd.effects_path).name)),
    ),
]

一旦完成,创建一个新的可分发,就是这样:D

【讨论】:

好的,谢谢@Marco FC,我会尝试并更新您的任何内容 效果很好,谢谢@Marco FC 我不知道为什么,但这对我不起作用... 马可,你能帮帮我吗?我在***.com/questions/70742358/… 发布了我的踪迹【参考方案2】:

以下代码适用于我:

python3.9
Python 3.9.5 (default, May 19 2021, 11:32:47) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from kivymd.effects.stiffscroll import StiffScrollEffect
[INFO   ] [Logger      ] Record log in /home/username/.kivy/logs/kivy_21-10-02_3.txt
[INFO   ] [Kivy        ] v2.0.0
[INFO   ] [Kivy        ] Installed at "/usr/local/lib/python3.9/dist-packages/kivy/__init__.py"
[INFO   ] [Python      ] v3.9.5 (default, May 19 2021, 11:32:47) 
[GCC 9.3.0]
[INFO   ] [Python      ] Interpreter at "/usr/bin/python3.9"
[INFO   ] [KivyMD      ] 0.104.2, git-bc7d1f5, 2021-06-06 (installed at "/usr/local/lib/python3.9/dist-packages/kivymd/__init__.py")
[INFO   ] [Factory     ] 186 symbols loaded
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_sdl2, img_pil (img_ffpyplayer ignored)
[INFO   ] [Text        ] Provider: sdl2
print(StiffScrollEffect)
<class 'kivymd.effects.stiffscroll.StiffScrollEffect'>

【讨论】:

我不明白你@Dmitry 请解释一下 我也得到了和你一样的输出,但我似乎不知道如何解决这个错误 请尝试运行相同的命令。如果它有效,那么问题不在于 kivy 安装,您必须提供有关您正在做什么的更多详细信息。如果不是问题出在您的环境中 以下链接可能会有所帮助:askubuntu.com/questions/382301/… 我正在使用 git cmd 而不是 ubuntu 或 linux 在 vi​​rtualenv 上运行它

以上是关于使用 pyinstaller 时没有名为 kivymd.effects 的模块的主要内容,如果未能解决你的问题,请参考以下文章

在使用 PyInstaller --onefile 打包 kivy 时包含 .kv/.json 文件?

使用 pyinstaller 打包后 Kivy 应用程序崩溃

SDL2 错误:使用 pyinstaller 冻结 kivy 应用程序时“无法加载图像 <default.png>”

pyinstaller kivy 错误无法获取任何图像提供程序,中止

Pyinstaller 难以通过 Kivy 构建 FileChooserListView

PyInstaller 3.2.1 与 Kivy 1.10.0 pyz 语法错误并且不打包