PyInstaller打包含matplotlib的项目报OSError:[WinError 1]错误求助
PyInstaller 打包引入matplotlib后运行报错修复方案
问题表现
- 集成sklearn依赖的Python项目原本可通过PyInstaller正常打包,新增matplotlib依赖后,打包生成的可执行文件启动即报错
- 错误栈核心为matplotlib初始化读取配置目录阶段,无法解析临时路径
R:\tmpXXXX,抛出OSError: [WinError 1] Incorrect function - 相关参考截图:
- 运行报错截图:

- 项目导入代码截图:

- 运行报错截图:
触发原因
该错误由三类问题共同导致:
- PyInstaller单文件(onefile)模式启动时会将打包资源解压到临时目录,部分Windows环境下会将临时目录分配给未就绪的光驱、失效网络映射盘(本次报错中的R盘即属于这类不可访问盘符)
- matplotlib初始化时会强制解析配置目录的真实绝对路径,调用
pathlib.resolve()方法时无法识别PyInstaller挂载的虚拟临时路径,直接触发系统级错误 - 原有spec配置未纳入matplotlib所需的静态资源、运行时钩子,同时开启UPX压缩时可能损坏matplotlib相关二进制文件,进一步放大路径识别异常
修复步骤
- 新增运行时钩子文件
在项目根目录创建mpl_fix.py,写入以下代码,提前强制matplotlib使用系统可正常访问的临时目录存储配置,跳过虚拟临时路径解析逻辑:
import os import tempfile os.environ["MPLCONFIGDIR"] = os.path.join(tempfile.gettempdir(), "mpl_cache")
- 更新spec配置
替换原有spec文件内容为以下配置,补全matplotlib资源收集规则、运行时钩子、UPX排除项,同时显式指定运行时临时目录为系统默认临时路径,避免选中不可用盘符:
import os from PyInstaller.utils.hooks import collect_data_files, collect_submodules block_cipher = None a = Analysis( ['quanlysinhvien.py'], pathex=[], binaries=[], # 收集matplotlib所需静态资源 datas=collect_data_files('matplotlib'), # 补全matplotlib隐藏导入,保留原有sklearn配置 hiddenimports=['sklearn.utils._typedefs'] + collect_submodules('matplotlib'), hookspath=[], hooksconfig={}, # 加载第一步创建的修复钩子 runtime_hooks=['mpl_fix.py'], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=None, noarchive=False, ) pyz = PYZ(a.pure, a.zipped_data, cipher=None) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='quanlysinhvien', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, # 排除matplotlib二进制文件,避免UPX压缩损坏 upx_exclude=['matplotlib*.dll', 'libmatplotlib*'], # 显式指定运行时临时目录为系统默认临时路径 runtime_tmpdir=os.environ.get('TEMP'), console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None, codesign_identity=None, entitlements_file=None, icon='quanlysinhvien.ico', )
- 清理缓存重新打包
删除项目目录下的build、dist文件夹,执行打包命令pyinstaller quanlysinhvien.spec即可。
排查验证
如果上述操作后仍存在报错,可先切换为单目录(onedir)模式验证:将EXE段中的a.binaries, a.zipfiles, a.datas参数移除,新增COLLECT段输出目录版程序,确认matplotlib功能正常后,再切回单文件模式排查盘符映射冲突。
内容的提问来源于stack exchange,提问作者Phúc Diamond
相关产品推荐
相关产品推荐

