使用PyInstaller打包Kivy程序遇无限Trace日志及递归错误
解决Kivy程序PyInstaller打包递归错误及无限日志问题
打包Kivy官方示例程序时,PyInstaller过程中出现无限循环的Trace日志,生成的exe运行时报maximum recursion depth exceeded和AttributeError: 'NoneType' object has no attribute 'write'错误,环境为PyInstaller 5.11.0、Python 3.8.3。
步骤1:修改主程序,禁用Kivy调试日志
在main2.py开头添加日志配置,避免打包时的无限日志输出:
import logging logging.basicConfig(level=logging.WARNING) from kivy.logger import Logger Logger.setLevel(logging.WARNING) # 原代码继续 from random import random from kivy.app import App from kivy.uix.widget import Widget from kivy.uix.button import Button from kivy.graphics import Color, Ellipse, Line # ... 剩余原代码保持不变
步骤2:修改.spec文件,添加必要配置
编辑生成的main2.spec,调整以下关键配置:
- 添加Kivy依赖的隐藏导入项
- 指定Kivy官方PyInstaller钩子路径
- 关闭UPX压缩(部分Kivy二进制文件与UPX不兼容)
修改后的完整.spec文件:
# -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis( ['main2.py'], pathex=[], binaries=[], datas=[], hiddenimports=['kivy.deps.sdl2', 'kivy.deps.glew', 'kivy.deps.angle', 'kivy.graphics'], hookspath=['site-packages/kivy/tools/packaging/pyinstaller_hooks'], 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='main2', debug=False, bootloader_ignore_signals=False, strip=False, upx=False, console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, ) coll = COLLECT( exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=False, upx_exclude=[], name='main2', )
步骤3:重新打包
使用修改后的.spec文件执行打包命令:
pyinstaller main2.spec
额外说明
- 如果
hookspath路径找不到,替换为本地Python环境中Kivy钩子的实际路径,通常为Lib\site-packages\kivy\tools\packaging\pyinstaller_hooks(Windows环境) - 关闭UPX是因为部分Kivy依赖的二进制库被压缩后会触发运行时错误
- 禁用调试日志可直接解决打包过程中的无限递归日志输出,同时消除运行时的logging模块递归异常
内容的提问来源于stack exchange,提问作者Coder Alpha
相关产品推荐
相关产品推荐

