使用Pathlib规范化UNC路径时会添加"$"符号。

4

我正在使用Python3.8,试图使用pathlib将一个字符串连接到远程计算机C驱动器上的UNC路径上。
但它的表现却很奇怪。
例如:

>>> remote = Path("\\\\remote\\", "C$\\Some\\Path")
>>> remote
WindowsPath('//remote//C$/Some/Path')

>>> remote2 = Path(remote, "More")
>>> remote2
WindowsPath('/remote/C$/Some/Path/More')

注意初始的//被转换为/了吗?但只要将初始路径放在一行上,一切就没问题了:

>>> remote = Path("\\\\remote\\C$\\Some\\Path")
>>> remote
WindowsPath('//remote/C$/Some/Path')

>>> remote2 = Path(remote, "more")
>>> remote2
WindowsPath('//remote/C$/Some/Path/more')

这个方法可以作为一种解决方法,但我怀疑自己可能对它的工作原理存在误解或者使用不当。
有谁知道到底发生了什么?


你能打印出remote._parts(也可能是两个remote2的_parts)吗?还有._root._drive。也许这与部件的解释方式以及它如何影响斜杠折叠有关。 - h4z3
1个回答

8
简而言之:你应该将整个UNC共享(\\\\host\\share)作为一个单元,pathlib有特殊处理UNC路径的处理,但它需要特定的前缀才能识别UNC路径。你不能使用pathlib的工具分别管理主机和共享,否则它会崩溃。
Path构造函数规范化(去除重复)路径分隔符:
>>> PPP('///foo//bar////qux')
PurePosixPath('/foo/bar/qux')
>>> PWP('///foo//bar////qux')
PureWindowsPath('/foo/bar/qux')

PureWindowsPath对被识别为UNC的路径,即//host/share...有一个特殊处理,避免了前导分隔符的折叠。

然而,您最初的连接方式使其处于一种奇怪的状态,因为它创建了一个形式为//host//share...的路径,然后当传递给构造函数时,路径会被转换回字符串,此时它不再匹配UNC,并且所有分隔符都被折叠:

>>> PWP("\\\\remote\\", "C$\\Some\\Path")
PureWindowsPath('//remote//C$/Some/Path')
>>> str(PWP("\\\\remote\\", "C$\\Some\\Path"))
'\\\\remote\\\\C$\\Some\\Path'
>>> PWP(str(PWP("\\\\remote\\", "C$\\Some\\Path")))
PureWindowsPath('/remote/C$/Some/Path')

问题似乎特别在于UNC路径上存在一个尾随分隔符,我不知道它是一个错误还是匹配了一些其他的UNC风格(但不是UNC)的特殊情况。
>>> PWP("//remote")
PureWindowsPath('/remote')
>>> PWP("//remote/")
PureWindowsPath('//remote//') # this one is weird, the trailing separator gets doubled which breaks everything
>>> PWP("//remote/foo")
PureWindowsPath('//remote/foo/')
>>> PWP("//remote//foo")
PureWindowsPath('/remote/foo')

这些行为似乎没有真正的文档说明。pathlib文档特别指出它会折叠路径分隔符,并且有一些UNC的示例表明它不会,但我不知道应该发生什么。无论如何,如果将前两个片段保留为单个“驱动器”单元,并且将共享路径视为驱动器,则它似乎只能适当地处理UNC路径的某些部分。这是一个特别记录在案的事实。
值得注意的是:使用joinpath//似乎不会触发重新规范化,因此您的路径仍然不正确(因为主机和共享之间的第二个pathsep保持加倍),但它不会完全折叠。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接