Pathlib 'normalizes' 带“$”的 UNC 路径

Pathlib 'normalizes' UNC paths with "$"

在 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')

这是一种解决方法,但我怀疑我误解了它应该如何工作或做错了。
有人知道发生了什么事吗?

tldr:您应该将整个 UNC 共享 (\\host\share) 作为一个单元提供,pathlib 具有 UNC 路径的特殊情况处理,但它特别需要此前缀才能 识别 路径为 UNC。您不能使用 pathlib 的工具来单独管理主机和共享,这会使 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 示例表明它没有,但我真的不知道应该做什么恰好发生。无论哪种方式,如果前两个段保持为单个 "drive" 单元,并且共享路径被视为驱动器 is specifically documented.

,它似乎只能在某种程度上正确处理 UNC 路径

值得注意:使用 joinpath / / 似乎不会触发重新规范化,您的路径仍然不正确(因为主机和共享之间的第二个 pathsep 仍然加倍)但它不会彻底崩溃了。