You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyInstaller打包含matplotlib的项目报OSError:[WinError 1]错误求助

PyInstaller 打包引入matplotlib后运行报错修复方案

问题表现

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

触发原因

该错误由三类问题共同导致:

  1. PyInstaller单文件(onefile)模式启动时会将打包资源解压到临时目录,部分Windows环境下会将临时目录分配给未就绪的光驱、失效网络映射盘(本次报错中的R盘即属于这类不可访问盘符)
  2. matplotlib初始化时会强制解析配置目录的真实绝对路径,调用pathlib.resolve()方法时无法识别PyInstaller挂载的虚拟临时路径,直接触发系统级错误
  3. 原有spec配置未纳入matplotlib所需的静态资源、运行时钩子,同时开启UPX压缩时可能损坏matplotlib相关二进制文件,进一步放大路径识别异常

修复步骤

  1. 新增运行时钩子文件
    在项目根目录创建mpl_fix.py,写入以下代码,提前强制matplotlib使用系统可正常访问的临时目录存储配置,跳过虚拟临时路径解析逻辑:
import os
import tempfile
os.environ["MPLCONFIGDIR"] = os.path.join(tempfile.gettempdir(), "mpl_cache")
  1. 更新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',
)
  1. 清理缓存重新打包
    删除项目目录下的build、dist文件夹,执行打包命令pyinstaller quanlysinhvien.spec即可。

排查验证

如果上述操作后仍存在报错,可先切换为单目录(onedir)模式验证:将EXE段中的a.binaries, a.zipfiles, a.datas参数移除,新增COLLECT段输出目录版程序,确认matplotlib功能正常后,再切回单文件模式排查盘符映射冲突。


内容的提问来源于stack exchange,提问作者Phúc Diamond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:03:19