ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WinError 206 文件名或扩展名太长:Windows 长路径限制的诊断与彻底解决

WinError 206 文件名或扩展名太长:Windows 长路径限制的诊断与彻底解决 遇到 [WinError 206] 文件名或扩展名太长 的朋友十有八九是在 Windows 上跑 pip install 装东西的时候突然弹出这一行刺眼的红字。我第一次撞上它是在一台 Windows 开发机上装 torch 的时候当时真是一脸懵文件名明明看着不长凭什么说太长后来翻了不少资料也做了不少实验才弄明白这个错误的根本原因——不是包名本身的问题而是 Windows 从 API 层面卡死了一个 260 字符的路径上限现代 Python 项目的依赖路径只要稍微叠几层就很容易顶到天花板。这篇文章我不打算只给一个“改注册表”的万能答案而是把诊断思路、系统级修复、环境侧瘦身和几个特殊场景救急方法全串起来按我实际工作中的优先级排好。无论你是刚入门的新手还是在 Windows 上玩 AI 项目、处理大量第三方依赖的老手都能在里边找到对应的解法。1. 先认清 WinError 206 的真面目不是 pip 坏了是 Windows 的路径上限1.1 错误现场一般长什么样这个错误的典型表现是pip 在下载、解压或者往 site-packages 里写文件时突然中断报错信息里会带着[WinError 206] 文件名或扩展名太长后面还会跟一个具体的文件路径。比如ERROR: Could not install packages due to an OSError: [WinError 206] 文件名或扩展名太长。文件 C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\torch\include\ATen\ops\...不同 pip 版本、不同包的报错样式略有差异但核心都是同一个 OSError。注意这里有个误导性很强的地方路径上那串字符看起来可能也就两百来个字符离“很长”的直觉距离差得远所以很多人会以为是 pip 的 bug甚至是杀毒软件拦截折腾半天方向全错了。1.2 260 字符限制到底是什么原理Windows 从 Win32 API 这一层就留下了历史包袱MAX_PATH宏定义是 260意味着传统 Win32 函数处理文件路径时完整路径盘符、目录、分隔符、文件名、结尾的空字符加起来不能超过 260 个字符。但文件系统本身其实没这个限制——NTFS 支持单文件路径上限达到 32767 个字符真正卡住的是应用层调用 API 时的那道门槛。打个比方你家门口那扇门只有一米宽但屋子里其实很宽敞结果就是稍微大一点的快递长路径送到门口就进不来了。pip 是用 Python 写的Python 在 Windows 上运行时调用文件操作一旦路径超过 260底层就返回ERROR_FILENAME_EXCED_RANGE也就是你说的 WinError 206。1.3 为什么现代 Python 项目频繁踩中这个雷以前 Python 包普遍简单site-packages 下结构不深出问题概率不高。现在情况完全不同了几个因素叠在一起206 就变成了高频事故默认安装路径本身就很长。Windows 上 Python 官方安装包往往装到C:\Users\用户名\AppData\Local\Programs\Python\Python311\Lib\site-packages光这前半段轻轻松松超过 120 个字符。用户名再长一点、带空格或者中文路径层数继续往上堆。现代包依赖树越来越深尤其 AI/ML 领域。torch、tensorflow、paddlepaddle 这类包include 目录里经常嵌套五六层comfyui-manager 这类节点管理工具的依赖树也很夸张子依赖一多路径很容易爆。虚拟环境是在基础路径上再套一层名为venv\Lib\site-packages的目录总长度雪上加霜。我整理过几种典型场景的路径长度分布大家可以对照自己环境感受一下场景典型路径前缀到 site-packages 的大致长度系统管理员默认安装C:\Users\Admin\AppData\Local\Programs\Python\Python311约 120 字符中文/长用户名默认安装C:\Users\张三的电脑名称特别长\AppData\Local\Programs\Python\Python311约 160 字符企业域账号用户安装C:\Users\zhangsan.companyname\AppData\Local\Programs\Python\Python311约 170 字符加上虚拟环境后缀上述任意路径 \venv\Lib\site-packages再增加 25 字符AI 包深层文件上述任意路径 \torch\include\ATen\ops\xxx.h再增加 30~60 字符你那台机器上要是用户名比较“有个性”再加一层虚拟环境、再装一个 idna 或者 grpcio 这种嵌套深的包非常容易就撞上 260。2. 动手之前先诊断确认超长的部分到底在哪一段2.1 用 PowerShell 快速计算路径总长出问题时先把报错里提到的完整路径复制出来用 PowerShell 算一下实际长度。这里有个技巧Length属性统计的是字符数不含结尾空字符实际 Win32 判断是否超长还会算上那个空字符所以比 260 小一点点也可能触发错误。$p C:\Users\Administrator\AppData\Local\Programs\Python\Python311\Lib\site-packages\torch\include\ATen\ops\a\b\c.h $p.Length如果结果接近 260那基本实锤路径问题。如果想更彻底一点写个小脚本把 site-packages 下所有超过 240 字符的文件路径全列出来提前把雷排掉Get-ChildItem -Path C:\Python311\Lib\site-packages -Recurse -File | Where-Object { $_.FullName.Length -ge 240 } | Select-Object -First 50 FullName, {nLength;e{$_.FullName.Length}} | Format-Table2.2 拆解路径看每一层贡献了多少拿到长路径后把路径按\拆开逐段看长度。常规经验是这几个关键变量C:\Users\用户名\这一段是硬开销用户名越长越吃亏中文用户名在部分工具里还可能引发其他编码问题。Python 安装位置。默认的用户目录安装路径非常深换成C:\Python311这种短根路径直接从 120 字符降到 60 以内。虚拟环境位置。建在项目目录下路径跟着项目走建在C:\venvs\foo路径就很短。包本身的目录结构。torch 这种包我们改不了但前几层能控制。2.3 确认当前系统有没有开长路径很多时候 206 反复出现是因为你以为 Windows 早就支持长路径了但实际注册表开关并没有打开。在管理员 PowerShell 里跑一句reg query HKLM\SYSTEM\CurrentControlSet\Control\FileSystem /v LongPathsEnabled看见0x1才说明系统级长路径支持已开启要是0x0或者提示找不到那就是 260 限制还在生效。即使开到了0x1依然可能报 206因为个别老工具走的是旧版 Win32 API不认这个开关。这种情况通常发生在编译类依赖、部分 C 扩展安装脚本里后面我会专门讲怎么应对。3. 系统级根治开启 Windows 长路径支持3.1 注册表一劳永逸法最推荐管理员 PowerShell 里执行以下命令把注册表里的LongPathsEnabled设为 1reg add HKLM\SYSTEM\CurrentControlSet\Control\FileSystem /v LongPathsEnabled /t REG_DWORD /d 1 /f也可以用 regedit 图形界面定位到计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem找到LongPathsEnabled双击改成 1二进制类型是REG_DWORD。完了重启电脑或者重启 Windows 资源管理器部分进程会重新读取该配置但稳妥起见我建议直接重启一次。这个开关打开后Win32 API 的路径上限从 260 直接提到 32767绝大多数 206 都会烟消云散。注意这是系统级设置这台机器上所有遵守新版 API 的程序都受益不是只对 pip 生效。3.2 组策略方式适合 IT 集中管理企业内部机器如果被域策略管控注册表改了也可能被刷回来。走组策略更合规WinR → gpedit.msc 计算机配置 → 管理模板 → 系统 → 文件系统 启用 Win32 长路径改成“已启用”确认后同样需要重启生效。组策略里修改的本质还是注册表那一个键但权限管理上更规范适合批量下发。3.3 版本要求与开启后的验证长路径开关不是所有 Windows 都支持。Win10 16072016 年发布以后、Win11 全系支持Win10 1511 及以前、Win8/Win7 没有这个开关直接改注册表也不生效。如果你还在老系统重点参考第 4 节的环境瘦身方案。开启后验证很简单重新装一遍刚才报错的包要是还能跑出 206再检查是否装的旧版本 pip 对长路径处理不完善顺手升级 pippython -m pip install --upgrade pip3.4 升级 pip 也有讲究我自己遇到过一种情况系统层面长路径已经开了还是报 206最后发现是 pip 版本太老。2020 年以后的 pip 才对长路径支持得比较完整。你可以先看一眼版本python -m pip --version pip --version如果pip命令本身提示“无法将 pip 项识别为 cmdlet、函数、脚本文件或可运行程序的名称”说明环境变量 PATH 里没加 Python 的 Scripts 目录这是另一个高频问题跟 206 没关系但常一起出现。解决方式是用python -m pip ...代替裸pip ...再顺手把C:\Python311\Scripts加进 PATH。注意pip 升级别在 Windows 应用商店版 Python 或者 externally-managed-environment 环境下硬来那种环境会提示先用python -m pip install --upgrade pip --break-system-packages或者直接换用虚拟环境。4. 不想动系统就动环境Python 与目录结构的瘦身术4.1 把 Python 装到短路径注册表开关是最省事的但在一些老系统上并不适用或者你不想因为改注册表影响别的应用。这时优先把 Python 装到一个短路径下。我自己现在 Windows 机器上固定用C:\Python311这种三段以内的路径。安装时不要用默认的Install for current user改成Install for all users安装位置手动填C:\Python311。装完以后原默认路径的前 120 字符开销直接砍掉一半以上pip 的缓存也可以同步设置到短路径避免它把索引文件写到用户目录深处。4.2 虚拟环境别建在路径深坑里如果你用 venv 或 virtualenv建虚拟环境时路径一定要短。对比一下这两种做法❌ C:\Users\李小明\Documents\Projects\python\ml-experiment\venv ✅ C:\venvs\mlexp后者和前者相比光虚拟环境这一层就少了 60 个字符以上。别小看这点压缩实测中用长路径虚拟环境 install 某些含深层 include 的 C 扩展包会 206换到短路径虚拟环境一路畅通。建好虚拟环境后再加一步把 pip 缓存和临时目录也挪到短路径防止 pip 解压时在%TEMP%里爆长度。# 设置 pip 配置目录与缓存目录 pip config set global.cache-dir C:\pipcache # 设置 Windows 临时目录为短路径 [Environment]::SetEnvironmentVariable(TEMP, C:\Temp, User) [Environment]::SetEnvironmentVariable(TMP, C:\Temp, User)这里解释一下为什么临时目录也会影响 206pip 在安装某些包时会先把文件解压到临时目录再移动到 site-packages如果临时目录本身嵌套在用户路径深处那解压路径加上包内深层结构同样会超长。4.3 8.3 短文件名的巧用Windows 文件系统还为每个文件保留了一个“8.3 短文件名”形如PROGRA~1。用dir /x可以查到一个长目录对应的短名称。某些老工具只认短路径用短路径能把路径压短一截。dir /x C:\看到类似PROGRA~1、PYTHON~1这样的名字如果你确定要引用的路径包含它就可以把这一层替换成短名。不过要注意Windows Server 和部分新系统默认关闭了 8.3 生成的策略追求极致压路径的时候可以开启fsutil behavior set disable8dot3 0这个操作是“可能需要但不一定推荐”的因为会轻微影响目录性能而且如果你全用长路径也不卡在 206没必要折腾。4.4 环境变量与 PATH 的标准化把 Python 路径改成C:\Python311后顺手把 PATH 里的旧路径删掉只保留C:\Python311 C:\Python311\Scripts这样既解决“无法将 pip 项识别”的报错也避免系统在解析 PATH 时因为路径过长出幺蛾子。PATH 里路径过多过长在部分 Windows 工具中也容易引发奇奇怪怪的问题虽然没有直接的 206但顺带清理了更干净。5. 特殊场景救急顽固包、下载慢、残留目录5.1 换国内镜像源治标又治本网络热词里一堆“pip install modelscope error: externally-managed-environment”、“pip 使用清华镜像源安装”之类的提问。镜像源解决的是下载速度、超时失败的问题与 206 不直接相关但安装超时重试时如果在半途中断残留的临时文件更容易造成路径烦恼。建议直接把镜像源写进 pip 配置少操一份心。Windows 上 pip 配置文件位置%APPDATA%\pip\pip.ini没有就新建内容参考[global] index-url https://pypi.tuna.tsinghua.edu.cn/simple trusted-host pypi.tuna.tsinghua.edu.cn也可以用命令行临时指定python -m pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple阿里云、中科大源同理。实测下来国内网络环境下这些源的速度稳定性都远好于官方源能减少很多连带问题。5.2 先下载 wheel 再本地安装有些包安装失败是下载阶段被意外中断可你没法确认是不是路径问题。这时把包先下载到本地短路径再手动安装能把“下载问题”和“安装问题”剥离开来。python -m pip download --no-deps -d C:\wheels 包名 python -m pip install C:\wheels\包名.whl本地安装还有一个好处pip 安装 wheel 时不需要经历源码解压、编译等环节路径问题通常比源码安装少很多。你甚至可以先用pip download把所有依赖都拉下来然后在内网、离线环境里慢慢折腾。5.3 残留的超长目录怎么删206 装的半截失败后site-packages 里可能残留一个普通方式删不掉的长目录。此时在 PowerShell 里用Remove-Item -LiteralPath也不一定靠谱最稳的是 robocopy 镜像空目录删除法mkdir C:\empty_dir robocopy C:\empty_dir C:\Python311\Lib\site-packages\那个超长目录名 /mir rmdir C:\Python311\Lib\site-packages\那个超长目录名原理很简单robocopy 在镜像时会遍历处理超长路径最后再把它整个删掉。这是 Windows 上删长路径的祖传技巧。如果连 robocopy 都因为路径太长而找不到目标还可以先把外层目录用短路径方式重命名比如dir /x查短名再ren压缩路径长度后再删。5.4 不是 206但总是被误认为 206 的编译错误有些用户在装 lxml、pydantic-core 这类带 C 扩展的包时出现满屏红字里既有路径又有error MSB...、cl.exe之类关键字就误以为是 206。实际情况是缺 Microsoft C Build Tools路径只是被顺便展示。如果确实缺编译工具装一个 Visual Studio Build Tools 选“使用 C 的桌面开发”工作负载或者去 Microsoft 官网下 C 生成工具。装完重新开一个终端再 pip install。这种时候再开关长路径都不如把编译工具链配齐方向要搞对。5.5 针对性参数组合排查时遇到不确定因素可以用几个临时参数组合快速验证python -m pip install 包名 --no-cache-dir --force-reinstall --no-deps--no-cache-dir能避开 pip 缓存目录里可能存在的深层结构问题--force-reinstall保证在断点残留后强制重来--no-deps只装指定包减小错误面。如果这样装能过那就是某个依赖子包的路径问题再按依赖树逐个击破。6. 我踩过的几个坑以及最终建议6.1 案例一长用户名 深依赖的组合有位同事的账号是zhangsan.sales.department这种域账号配合默认安装路径到 site-packages 就已经 170 字符了。他装 pywin32 的依赖 pypiwin32 时遇到 206我把 Python 挪到 C 盘短路径再重建了一个C:\venvs\win32demo虚拟环境问题立刻消失。这个案例说明改注册表不是万能的路径瘦身是最稳的兜底。6.2 案例二项目在 OneDrive/同步盘里另一位朋友的项目建在 OneDrive 同步目录下路径形如C:\Users\xx\OneDrive\文档\PythonProject\...本身就大几十个字符再叠虚拟环境和 AI 包依赖顺利触发 206。同步盘还会持续锁文件pip 写入时更容易碰到权限冲突。当时我建议在本地磁盘短路径建虚拟环境代码目录不动问题解决。如果你项目也在各类云同步目录里这是最容易忽略的坑。6.3 案例三整合包里的 comfyui-manager 安装再比如网络上热度很高的 comfyui-manager 这类节点管理工具在 Windows 整合包里装的时候也经常报错。这类包的依赖树极深经常出现...\Lib\site-packages\aiohttp\...这种深层结构一旦用户目录路径长几乎必炸。处理方式就是“四件套”组合开启长路径支持 Python 装短路径 虚拟环境放短路径 pip 走国内源。这套组合我目前没遇到搞不定的 206。6.4 我推荐的最终操作顺序如果你现在正面对这个错误建议按下面这个顺序走别跳过诊断步骤直接改注册表先复制报错里的路径确认总长是否接近 260如果离得很远另找原因多半是编译工具或缺依赖。管理员 PowerShell 执行reg add ... LongPathsEnabled ... /d 1 /f重启。重启后升级 pip再装一次包还失败就走第 4 步。把 Python 重装到C:\Python311这类短路径虚拟环境建在C:\venvs\xxx。设置 pip 缓存与 TEMP/TMP 为短路径换清华或阿里镜像源。极个别老工具不认长路径开关手动把 wheel 包下载到短目录从本地安装绕过去。残留删不掉的长目录robocopy 空目录镜像删。最后再分享一个小技巧装好长路径开关和短路径环境后把下面这一段 PowerShell 保存成check-longpath.ps1以后哪个目录报 206直接扫一眼就知道还有没有隐患param([string]$Path) Get-ChildItem -Path $Path -Recurse -Force -ErrorAction SilentlyContinue | Where-Object { $_.FullName.Length -ge 250 } | Sort-Object {e{$_.FullName.Length}} -Descending | Select-Object -First 20 FullName, {nLength;e{$_.FullName.Length}}我个人在实际操作中的体会是WinError 206 这个错误技术上并不难解决难的是很多人第一次见到时被它的报错文案带偏了方向。只要理解了 260 字符上限再把“系统开关 路径瘦身 环境变量标准化”这套组合拳打出去基本能做到一次解决、长期不再犯。希望这篇经验帖能帮你在 Windows 上装包时少走点弯路。
返回列表