Python代码正常但PyInstaller打包后重启exe报模块缺失错误
问题描述
本地运行Python代码正常,经PyInstaller打包为exe文件后,首次运行可正常生成报告;但重启应用(支持用户导入下一个文件)时,程序崩溃并抛出如下异常:
Traceback (most recent call last): File "Ish.py", line 1, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "ReportGenerator.py", line 1, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "fpdf\__init__.py", line 22, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "fpdf\fpdf.py", line 97, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "fpdf\image_parsing.py", line 25, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "fpdf\svg.py", line 38, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "fpdf\output.py", line 35, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "fontTools\subset\__init__.py", line 8, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "fontTools\ttLib\tables\otTables.py", line 19, in <module> File "PyInstaller\loader\pyimod02_importers.py", line 378, in exec_module File "fontTools\pens\boundsPen.py", line 2, in <module> ModuleNotFoundError: No module named 'fontTools.misc.bezierTools'
已尝试的操作:
- 在.spec文件中添加隐式导入配置:
a = Analysis( ['Ish.py'], pathex=[], binaries=[], datas=[('logo.ico', '.')], hiddenimports=['fontTools.misc.bezierTools', 'fontTools.subset', 'fontTools.ttLib', 'fontTools.pens.boundsPen'], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], noarchive=False, optimize=0, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, a.binaries, a.datas, [], name='Threat Intellisense', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, icon=['logo.ico'], )
- 使用
--add-data参数引入fonttools目录,问题仍未解决。
解决方案
锁定fontTools兼容版本
部分fontTools版本的模块结构有调整,可能导致依赖收集不全。执行以下命令安装稳定兼容版本:pip install fonttools==4.38.0安装完成后重新打包测试。
修改hiddenimports为完整包导入
将.spec文件中的hiddenimports改为直接导入整个fontTools包,让PyInstaller自动收集所有子模块:hiddenimports=['fontTools'],禁用UPX压缩
UPX压缩可能破坏部分模块的结构,导致二次运行时加载失败。修改.spec文件中的UPX配置:upx=False,指定固定临时目录
单文件打包时,PyInstaller会在系统临时目录解压文件,二次运行时可能出现文件被清理的情况。在.spec文件中指定固定临时目录:runtime_tmpdir='./app_temp',确保该目录有读写权限,避免依赖文件丢失。
手动补全所有相关子模块
如果上述方法无效,直接列出fontTools的所有关联子模块:hiddenimports=[ 'fontTools.misc.bezierTools', 'fontTools.misc', 'fontTools.pens', 'fontTools.ttLib', 'fontTools.subset', 'fontTools.ttLib.tables.otTables' ],
内容的提问来源于stack exchange,提问作者Eesh Gharat
相关产品推荐
相关产品推荐

