简而言之:你应该将整个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//')
>>> PWP("//remote/foo")
PureWindowsPath('//remote/foo/')
>>> PWP("//remote//foo")
PureWindowsPath('/remote/foo')
这些行为似乎没有真正的文档说明。pathlib文档特别指出它会折叠路径分隔符,并且有一些UNC的示例表明它不会,但我不知道应该发生什么。无论如何,如果将前两个片段保留为单个“驱动器”单元,并且将共享路径视为驱动器,则它似乎只能适当地处理UNC路径的某些部分。这是一个
特别记录在案的事实。
值得注意的是:使用
joinpath
/
/
似乎不会触发重新规范化,因此您的路径仍然不正确(因为主机和共享之间的第二个pathsep保持加倍),但它不会完全折叠。
remote._parts
(也可能是两个remote2
的_parts)吗?还有._root
和._drive
。也许这与部件的解释方式以及它如何影响斜杠折叠有关。 - h4z3