启用系统长路径支持需同时满足:注册表LongPathsEnabled=1、Python≥3.8、python.exe禁用兼容模式;优先用pathlib.Path替代os.path,避免手动拼"?"前缀。

直接启用系统长路径支持 + 用 pathlib.Path,别手动拼 "\?" 前缀——它容易在 UNC、相对路径、环境变量展开等场景下失效。
确认是不是真被260字符卡住
别一报 FileNotFoundError 就改代码。先验证是否路径长度惹的祸:
- 用 PowerShell 运行
Get-Item "你的完整路径",若报错含Cannot find path和260或MAX_PATH,基本锁定 -
os.path.exists()或Path("...").exists()返回False,但把父目录重命名为短名(如C: mp)后立刻变True,是典型表现 - 在 Python 中跑
len(Path("your_path").resolve().as_posix()),超过 240 就高度可疑(留出 API 调用开销)
必须同时满足的三件事才能让Python真正用上长路径
只改注册表 ≠ 解决问题。缺一不可:
- 注册表项
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystemLongPathsEnabled值为1(DWORD,十进制),且已重启生效 - Python ≥ 3.8(3.6+ 开始支持,但 3.8 才默认调用长路径 API;conda 环境里可能仍是旧版,需用
python --version确认) - Python 进程不能以兼容模式运行:右键
python.exe→ 属性 → 兼容性 → 取消勾选“以兼容模式运行”;IDE(PyCharm/VS Code)也要关掉兼容模式并彻底杀掉残留python.exe进程
用 pathlib.Path 安全操作,避开 os.path 的坑
os.path.isdir() 和 os.listdir() 在路径超长时可能比 Path().is_dir() 更早抛 [WinError 206],因为前者对父路径结构更敏感。推荐统一用 pathlib:
华为云 Python SDK 查询工具。自动发现已安装 SDK 的服务包、Client类、API 方法、入参详情、类信息(__init__ 参数、属性、类型、描述),支持关键字搜索,快速定位目标 API 使用方法。
立即学习“Python免费学习笔记(深入)”;
- 构造
Path对象不触发校验:p = Path(r"C:erydeep...ile.txt")成功不代表后续能读 - 用
p.is_file()、p.exists()、p.iterdir()等方法,它们在 3.8+ 启用长路径后才真正走新 API - 避免混用:
os.path.join(str(p.parent), "new.txt")会丢失长路径上下文,应改用p.parent / "new.txt" - 不要手动拼
"\?\" + str(p.absolute()):若原路径是 UNC(\servershare),得改成"\?\UNC\server\share",漏掉这个逻辑就崩
临时救急:改 TMP/TEMP 或用 robocopy /purge
没权限改注册表或不能重启时,这些方案见效最快:
- 缩短 pip 安装临时路径:新建
C: mp,PowerShell 中执行$env:TMP="C: mp"; $env:TEMP="C: mp",再pip install - 删不掉的虚拟环境目录:用
robocopy C:empty "C:yourenv" /purge(C:empty是空文件夹),清空后再rmdir - 单个超长文件删除:PowerShell 管理员窗口执行
Remove-Item -LiteralPath "C:erylongpath" -Force,-LiteralPath关键,跳过路径解析
真正麻烦的不是“怎么加前缀”,而是以为 Path().exists() 返回 True 就万事大吉——它可能只是没报错,但后续 open() 或 shutil.copytree() 仍会因底层 Win32 API 调用失败而中断。

















