【问题标题】:Long paths in Python on WindowsWindows 上 Python 中的长路径
【发布时间】:2015-06-15 22:56:24
【问题描述】:

在 Windows 下运行 Python 编程时遇到问题。我需要使用超过 256 个或 whatsathelimit 个字符的文件路径。 现在,我基本上已经阅读了两种解决方案:

  1. 使用来自 kernel32.dll 的 GetShortPathName 并以这种方式访问​​该文件。

很好,但我不能使用它,因为我需要以某种方式使用路径

shutil.rmtree(short_path)

short_path 是一个非常短的路径(类似于D:\tools\Eclipse),而长路径出现在目录本身中(该死的 Eclipse 插件)。

  1. 在路径前添加"\\\\?\\"

我没有设法以任何方式完成这项工作。尝试以这种方式做任何事情总是会导致错误WindowsError: [Error 123] The filename, directory name, or volume label syntax is incorrect: <path here>

所以我的问题是:如何使第二个选项起作用?我强调我需要以与选项 #1 中的示例相同的方式使用它。

还有其他方法吗?

编辑:我需要在 Python 2.7 中工作的解决方案

EDIT2:问题Python long filename support broken in Windows 确实给出了带有“魔术前缀”的答案,我在这个问题中说我知道。我不知道如何使用它。正如我在上面所写的,我试图将它添加到路径中,但它失败了。

【问题讨论】:

  • Python long filename support broken in Windows 的可能副本。它有一个不同的字符串要前置。你试过用那个字符串吗?
  • @Pureferret 是的,但接受的答案正是我无法完成的工作:D 好吧,我在这里的字符串与那里的字符串相同,但是这个字符串被转义了。
  • 另外,这是一个使用kernal32.dll的解决方案,不确定你是否看过这个版本:stackoverflow.com/q/11420689/1075247
  • 所以您尝试过"\\?\" 而不仅仅是"\\\\?\\"
  • 一个重要的技巧:如果你使用 Python 2.x,你的长文件名必须是 unicode 而不是 str 类型,所以前缀必须这样写:u'\\\\?\\UNC\\'

标签: python windows


【解决方案1】:

py 3.8.2

# Fix long path access:
import ntpath
ntpath.realpath = ntpath.abspath
# Fix long path access.

就我而言,这解决了从长路径运行脚本的问题。 (https://developers.google.com/drive/api/v3/quickstart/python) 但这不是一个通用的解决方案。 看起来 ntpath.realpath 实现有问题。此代码将其替换为虚拟对象。

【讨论】:

  • 虽然此代码可以解决 OP 的问题,但最好包含关于您的代码如何解决 OP 问题的说明。通过这种方式,未来的访问者可以从您的帖子中学习,并将其应用到他们自己的代码中。 SO 不是编码服务,而是知识资源。此外,高质量、完整的答案更有可能获得支持。这些功能,以及所有帖子都是独立的要求,是 SO 作为一个平台的一些优势,将其与论坛区分开来。您可以编辑以添加信息和/或用引用和源文档链接补充您的解释
【解决方案2】:

让我为任何寻求直接答案的人简化一下:

  1. 路径必须是 unicode,在字符串前面加上 u,例如 u'C:\\path\\to\\file'
  2. 路径需要以\\\\?\\ 开头(转义为\\?\),如u'\\\\?\\C:\\path\\to\\file'
  3. 没有正斜杠只有反斜杠:/ --> \\
  4. 必须是绝对路径;它不适用于相对路径

【讨论】:

  • 注意:第 1 项特定于 Python 2,在您编写此答案时不再受支持。在 Python 3 中,它只需要为 str(不需要特殊前缀即可生成 str 文字)。
【解决方案3】:

好吧,在我认真询问某人二十分钟后,我似乎一如既往地找到了困扰我一周的问题的答案。

所以我发现我需要确保正确完成两件事:

  1. 路径只能包含反斜杠,不能包含正斜杠。
  2. 如果我想做一些类似列出目录的操作,我需要用反斜杠结束路径,否则 Python 会在其后面附加 /*.*,这是一个正斜杠,这很糟糕。

希望至少有人会觉得这很有用。

【讨论】:

  • @Pureferret Lol :D 感谢文化的丰富,我以前从未听说过橡皮鸭调试
  • 鉴于上述问题 2,您似乎没有使用unicode 路径,即u'\\'.join([ur'\\?', path.decode('mbcs')])。 Python 将\*.* 附加到unicode 路径和/*.* 到字节字符串路径。通过添加尾随\,它只是追加*.*,但您仍在调用ANSI API FindFirstFileA,限制为MAX_PATH 个字符。
  • 阅读FindFirstFile 的文档。它在lpFileName 的描述中直接告诉您您需要使用该函数的 Unicode([W]ide 字符)版本,即FindFirstFileW(名称在“要求”中)。在大多数情况下,Python 在传递 unicode 参数时使用 Windows 宽字符 API,尤其是在 os 模块中。
  • @HarryJohnston,如果您不熟悉 Python 2.x,字符串文字是 str 字节字符串,除非以 u 为前缀来创建 unicode 实例。连接strunicode 使用默认的ASCII 编码来解码str 实例,因此如果short_pathunicode,则在'\\\\?\\' 前面添加unicode;否则它会创建一个新的str。 OP 应在前面加上 u'\\\\?\\'。另外,请阅读parsing arguments and building values,了解posix_listdir 中的PyArg_ParseTuple 调用发生了什么。
  • 只是为了补充我的经验,我遇到了和 OP 一样的问题。尾部斜杠对我没有帮助,但转换为 unicode 类型的字符串对我有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多