在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 吹一个垫圈。
路径构造函数规范化(删除重复数据(路径分隔符:
>>> 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
//
似乎不会触发重新规范化,您的路径仍然不正确(因为主机和共享之间的第二条路径保持双倍(,但它不会完全折叠。