Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows上Python中的长路径_Python_Windows - Fatal编程技术网

Windows上Python中的长路径

Windows上Python中的长路径,python,windows,Python,Windows,在Windows下运行Python编程时,我遇到了一个问题。我需要处理长度超过256个字符的文件路径。 现在,我基本上已经阅读了两种解决方案: 使用kernel32.dll中的GetShortPathName并以这种方式访问文件 这很好,但我不能使用它,因为我需要以某种方式使用路径 shutil.rmtree(short_path) 其中短路径是非常短的路径(类似于D:\tools\Eclipse),长路径出现在目录本身(该死的Eclipse插件) 将“\\\\?\\”前置到路径 我还没有设法

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

  • 使用kernel32.dll中的GetShortPathName并以这种方式访问文件 这很好,但我不能使用它,因为我需要以某种方式使用路径

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

  • “\\\\?\\”
    前置到路径
  • 我还没有设法以任何方式使这项工作成功。尝试以这种方式执行任何操作都会导致错误
    WindowsError:[error 123]文件名、目录名或卷标语法不正确:

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

    还有别的办法吗

    编辑:我需要在Python2.7中工作的解决方案


    EDIT2:这个问题的答案确实带有“魔法前缀”,我在这个问题中说我知道它。我不知道的是我如何使用它。我曾尝试将其预先写入路径,但正如我在上面所写的那样,它失败了。

    看来,像往常一样,在我认真询问某人之后的二十分钟,我找到了困扰我一周的问题的答案

    因此,我发现我需要确保两件事正确完成:

  • 路径只能包含反斜杠,不能包含正斜杠
  • 如果我想做一些类似于列出目录的事情,我需要以反斜杠结束路径,否则Python将向路径追加
    /*.
    ,这是一个正斜杠,这是不好的

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

    让我简化一下,让大家都能找到一个直截了当的答案:

  • 路径必须是unicode,在字符串前面加上
    u
    u'C:\\Path\\to\\file'
  • 路径需要以
    \\\\\?\\\
    开头(转义为
    \\\?\
    ),如
    u'\\\?\\C:\\Path\\to\\file'
  • 没有正斜杠只有反斜杠:
    /
    -->
    \\
  • 它必须是一条绝对的道路;它不适用于相对路径
  • py 3.8.2

    # Fix long path access:
    import ntpath
    ntpath.realpath = ntpath.abspath
    # Fix long path access.
    
    在我的例子中,这解决了从长路径运行脚本的问题。 () 但这并不是一个普遍的解决办法。
    看起来ntpath.realpath实现有问题。此代码将其替换为一个伪代码。

    的可能重复项。它前面有一个不同的字符串。你试过使用那个字符串吗?@Pureferret是的,但我不能接受的答案是:D我这里的字符串与那里的字符串相同,但是这个字符串被转义了。另外,这是一个使用kernal32.dll的解决方案,不确定你是否见过这个版本:所以你尝试了
    “\\?\”
    而且不仅仅是
    “\\\\?\”
    ?@Pureferret:1:是的,我看到了,这不是我需要的。如果我走了很长的路,我又回到了原来的位置。路径太长,Python无法使用。第二:什么D我在为\\?\添加字符串,我在问题中所写的内容刚刚被转义。@Pureferret Lol:D感谢文化的丰富,我在上述第2期之前从未听说过橡皮鸭调试,似乎您没有使用
    unicode
    路径,即
    u'\\\'.join([ur'\?',path.decode('mbcs'))
    。Python将
    \*.
    附加到
    unicode
    路径,将
    /*.*.
    附加到字节字符串路径。通过添加尾随的
    \
    它只是附加
    *.
    ,但您仍然在调用ANSI API
    FindFirstFileA
    ,限制为
    MAX\u PATH
    个字符。有关详细信息,请阅读文档。在
    lpFileName
    的描述中,它直接告诉您需要使用Unicode([W]ide字符)版本的函数,即
    FindFirstFileW
    (名称在“需求”中)。在大多数情况下,Python在传递
    unicode
    参数时使用Windows范围的字符API,特别是在操作系统模块中。@HarryJohnston,如果您不熟悉Python 2.x,字符串文字是
    str
    字节字符串,除非前缀是
    u
    ,以创建
    unicode
    实例。连接
    str
    unicode
    使用默认的ASCII编码来解码
    str
    实例,因此如果
    short\u path
    unicode
    ,则在
    前面加上“\\\\?\\”
    将导致
    unicode
    ;否则它将创建一个新的
    str
    。OP应该在
    u'\\\\?\\'
    前面加上前缀。另外,请阅读以了解
    posix\u listdir
    中的
    PyArg\u ParseTuple
    调用发生了什么情况。为了增加我的经验,我遇到了与OP相同的问题。尾随斜杠对我没有帮助,但转换为unicode类型的字符串对我有帮助。虽然此代码可以解决OP的问题,最好包括关于代码如何解决OP问题的解释。通过这种方式,未来的访问者可以从您的帖子中学习,并将其应用到自己的代码中。因此,它不是一种编码服务,而是一种知识资源。此外,高质量、完整的答案更有可能被提升。这些特性,以及所有帖子都是独立的要求,是SO作为一个平台的一些优势,使其区别于论坛。您可以进行编辑以添加信息和/或使用引用和到源文档的链接来补充您的解释注意:条目#1特定于Python 2,在您编写此答案时不再支持它。在Python3中,它只需要是
    str
    (不需要特殊前缀来生成
    str
    literal)。