PyInstaller打包含PyQt6与matplotlib的Python应用时,缺失matplotlib依赖及Qt6依赖链接警告问题
看起来你在打包这个DNA序列相似度工具时遇到了两个头疼的问题:matplotlib依赖没被正确打包进去,还有qt_material的导入顺序警告。我帮你一步步梳理问题根源和解决办法:
核心问题1:打包流程冲突,自定义spec未生效
首先发现一个关键错误:你修改了DNA_Sequence_Similarities.spec文件,但之后运行的打包命令是pyinstaller DSS.py ...——这个命令会重新生成一个全新的spec文件,直接覆盖你之前手动修改的版本!这就导致你在spec里设置的excludes=['PyQt5']、自定义hidden imports等配置完全没生效,这也是matplotlib依赖缺失的重要原因之一。
正确的打包流程应该是:
- 先运行一次命令生成初始spec文件(如果还没生成):
pyinstaller DSS.py --name DNA_Sequence_Similarities --onefile --windowed --icon=icon.ico --hidden-import=matplotlib --hidden-import=matplotlib.backends.backend_tkagg --hidden-import=matplotlib.backends.backend_pdf --collect-data matplotlib --collect-all qt_material --collect-all PyQt6
- 手动修改生成的
DNA_Sequence_Similarities.spec文件(按你的需求调整) - 之后的打包都要基于修改好的spec文件运行,而不是再次针对脚本文件:
pyinstaller DNA_Sequence_Similarities.spec
核心问题2:Onefile模式与COLLECT块冲突
你的spec文件里保留了COLLECT块,但--onefile模式下PyInstaller不需要这个块——COLLECT是用于生成目录结构(onedir模式)的,onefile模式下所有内容都打包在单个EXE里,多余的COLLECT块会导致打包逻辑混乱,甚至可能丢失依赖文件。
修正后的Onefile模式spec文件示例:
# -*- mode: python ; coding: utf-8 -*- from matplotlib import get_data_path # 手动收集matplotlib的核心数据文件 matplotlib_datas = [(get_data_path(), 'matplotlib/mpl-data')] a = Analysis( ['DSS.py'], pathex=[], binaries=[], datas=matplotlib_datas, hiddenimports=['matplotlib', 'matplotlib.backends.backend_tkagg', 'matplotlib.backends.backend_pdf'], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=['PyQt5'], noarchive=False, optimize=0, ) pyz = PYZ(a.pure) exe = EXE( pyz, a.scripts, a.binaries, a.datas, [], name='DNA_Sequence_Similarities', 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=['icon.ico'], # 自动收集qt_material和PyQt6的全部资源 collect_all=['qt_material', 'PyQt6'], )
核心问题3:matplotlib依赖未被正确收集
从你的打包日志里看到WARNING: collect_data_files - skipping data collection for module 'matplotlib' as it is not a package,这显然有问题——matplotlib是标准的Python包,出现这个警告大概率是因为PyInstaller的钩子识别异常,或者你的环境中matplotlib的安装路径有问题。
额外保障措施:
- 检查matplotlib安装状态:运行
pip show matplotlib确认它安装在当前Python环境的site-packages下,路径正确。 - 手动添加matplotlib数据文件:上面的spec示例里已经通过
get_data_path()手动引入了matplotlib的核心数据(字体、配置等),这能避免自动收集失效的情况。
核心问题4:qt_material的导入顺序警告
日志里的qt_material must be imported after PySide or PyQt!警告,本质是qt_material需要依赖PyQt/PySide的模块已加载才能正常初始化。
解决办法:
- 修改你的Python代码导入顺序:在
DSS.py的最开头,先导入PyQt6的核心模块,再导入qt_material:
# DSS.py开头的导入顺序 from PyQt6.QtWidgets import QApplication, QMainWindow from PyQt6.QtCore import Qt # 其他PyQt6模块... import qt_material # 然后是其他导入 import matplotlib
- 确保qt_material的资源被收集:spec文件里的
collect_all=['qt_material']会自动收集它的主题文件、样式表等运行时必需的资源。
最终验证
打包完成后,运行生成的DNA_Sequence_Similarities.exe,如果还是遇到问题,可以:
- 打开onefile模式的临时解压目录(路径类似
%TEMP%\_MEIPASSxxxx),查看是否包含matplotlib和qt_material的相关文件夹; - 确认PyInstaller、matplotlib、PyQt6的版本兼容性(你的PyInstaller 6.14.2和matplotlib、PyQt6 6.9.1是兼容的)。
内容来源于stack exchange

