Kivy+PyInstaller打包exe报错:'NoneType'无'load_module'属性
Kivy打包EXE后运行报错:AttributeError: 'NoneType' object has no attribute 'load_module'
报错信息
Traceback (most recent call last): File "main.py", line 12, in <module> from kivy.app import App File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "PyInstaller\loader\pyimod02_importers.py", line 499, in exec_module File "kivy\__init__.py", line 317, in <module> AttributeError: 'NoneType' object has no attribute 'load_module' [21476] Failed to execute script 'main' due to unhandled exception!
相关代码与配置
main.py关键代码
from kivy.app import App # 第12行 class MyMainApp(App): def build(self): self.title = "MyTitle" self.default_font = "Lato-Regular" return kv
当前使用的main.spec
# -*- mode: python ; coding: utf-8 -*- import os from kivy_deps import sdl2, glew block_cipher = None added_files = [ ( 'my.kv', '.' ), ] a = Analysis( ['main.py'], pathex=[], binaries=[], datas=[], hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, [], exclude_binaries=True, name='main', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=True, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, ) coll = COLLECT(exe, Tree('.'), exe, a.binaries, a.zipfiles, a.datas, *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)], strip=False, upx=True, upx_exclude=[], name='main', )
已尝试的无效操作
- 重新生成单文件/单目录模式的.spec文件
- 在.spec中添加"kivy.app"至hiddenimports
- 降级PyInstaller版本
解决方案
1. 修复.spec中的datas配置
定义的added_files未在Analysis的datas参数中引用,导致kv文件未被打包,可能引发Kivy初始化异常。修改Analysis部分:
a = Analysis( ['main.py'], pathex=[], binaries=[], datas=added_files, # 引用added_files hiddenimports=[], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, )
2. 添加Kivy核心隐式导入
扩展hiddenimports,加入Kivy运行必需的核心模块:
hiddenimports=['kivy.uix.widget', 'kivy.graphics', 'kivy.lang', 'kivy.config', 'kivy.app'],
3. 禁用UPX压缩
UPX压缩可能损坏Kivy的二进制依赖,在EXE和COLLECT段将upx=True改为upx=False:
exe = EXE( # 其他参数保留 upx=False, # 其他参数保留 ) coll = COLLECT( # 其他参数保留 upx=False, # 其他参数保留 )
4. 启用noarchive模式
在Analysis中设置noarchive=True,避免Kivy模块被打包进PYZ文件引发导入冲突:
a = Analysis( # 其他参数保留 noarchive=True, # 其他参数保留 )
5. 匹配Kivy与PyInstaller版本兼容性
确保两者版本适配,推荐组合:
- Kivy 2.1.0 + PyInstaller 5.6.2
- Kivy 2.2.0 + PyInstaller 5.10.1
执行命令重新安装指定版本:
pip install kivy==2.1.0 pyinstaller==5.6.2
内容的提问来源于stack exchange,提问作者user3242060
相关产品推荐
相关产品推荐

