You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Windows系统下Python访问长路径失败问题求助

解决Windows下Python 3.7长路径\\?\前缀失效的问题

你遇到的核心问题是Python 3.7对Windows原生长路径前缀的支持不完善,我来帮你拆解原因和可行的解决方案:

问题根源

在Python 3.7及更早版本中,内置的open()函数底层依赖标准C库的文件操作接口,而Windows的标准C库默认不识别\\?\这种特殊路径前缀——这个前缀是Windows原生API专属的格式,用来绕过系统默认的MAX_PATH(260字符)限制。所以即便你手动添加了前缀,open()依然无法正确解析它,最终抛出OSError: [Errno 22] Invalid argument

补充个细节:你的路径格式是符合\\?\要求的绝对路径,大小写(d:\)也不是问题,核心矛盾还是Python版本的API支持局限。

解决方案

方案1:用os模块原生接口替代open()

os.open()直接调用Windows原生API,能正确识别\\?\前缀,再通过os.fdopen()将文件描述符包装成常用的文件对象即可:

import os

test_path = '\\\\?\\d:\\' + ''.join(['a']*260)
print(test_path)
print(len(test_path))

# 用os.open打开,指定读写模式和文件创建规则
fd = os.open(test_path, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
with os.fdopen(fd, 'w') as f:
    pass

方案2:升级到Python 3.8+

Python 3.8及后续版本对Windows长路径做了针对性优化:不仅原生支持\\?\前缀,在Windows 10 1607+版本中还默认适配了系统的长路径功能(无需手动加前缀,只要系统开启相关设置)。升级后你的原始代码就能正常运行。

方案3:开启Windows系统级长路径支持(无需前缀)

如果你的Windows版本是10 1607/Server 2016及以后,可以通过以下步骤开启系统级长路径支持,无需依赖\\?\前缀就能处理超长路径:

  • 运行gpedit.msc打开组策略编辑器
  • 导航到计算机配置 > 管理模板 > 系统 > 文件系统 > NTFS
  • 启用启用Win32长路径选项
  • 重启电脑生效

额外验证说明

你提到未加\\?\前缀时会抛出FileNotFoundError,这是符合预期的——此时路径长度超过了Windows默认的MAX_PATH限制(260字符,包含路径分隔符和结尾空字符)。而加前缀后失效的核心原因,就是Python 3.7的open()函数不兼容Windows原生API的路径格式。

内容的提问来源于stack exchange,提问作者Dr_Zaszuś

火山引擎 最新活动