当我使用Path.relative_to
和os.path.relpath
时,我得到了一个不对称的行为,见下面的例子。在os模块中的工具通信中,我被引导相信它们的行为是相同的。
我在用两条路径
C:\Sync\Rmaster_head_\bin
C:\Sync\installed
我用的是Python 3.9.15。
操作系统路径关系路径
>>> import os.path
>>> import pathlib
>>> start = pathlib.Path(r"../../installed")
>>> rel_path = os.path.relpath(pathlib.Path(r"C:/Sync/Rmaster_head_/bin"), start=start)
>>> rel_path
'..\\..\\..\\..\\Sync\\Rmaster_head_\\bin'
>>> start / pathlib.Path(rel_path)
WindowsPath('../../installed/../../../../Sync/Rmaster_head_/bin')
>>> (start / pathlib.Path(rel_path)).resolve()
WindowsPath('C:/Sync/Rmaster_head_/bin')
双向路径库.路径.相对于
x一个一个一个一个x一个一个二个x
我注意到异常表明其中一个路径是相对路径,但在使用完整路径时也不起作用。
>>> path1 = pathlib.Path(r"C:\Sync\Rmaster_head_\bin")
>>> path2 = pathlib.Path(r"C:\Sync\installed\R2023.1.175_install\documentation")
>>> os.path.relpath(path1, start=path2)
'..\\..\\..\\Rmaster_head_\\bin'
>>> os.path.relpath(path2, start=path1)
'..\\..\\installed\\R2023.1.175_install\\documentation'
并且path1.relative_to(path2)
和path2.relative_to(path1)
都失效。
我错过了什么?
1条答案
按热度按时间7lrncoxx1#
您所缺少的是pathlib文档中关于这些方法的注解:
在
relative_to()
的文档下面:注意:此函数是
PurePath
的一部分,用于字符串。它不检查或访问底层文件结构。虽然仍然可以根据字符串推导出您要查找的相对路径,但显然该方法不能这样做,示例和错误消息对此都很清楚。
您在问题中提到的部分的顶部也明确提到了该函数不同于
os.path.relpath()
:**注意:**尽管
os.path.relpath()
和PurePath.relative_to()
有一些重叠的用例,但它们的语义差异很大,不足以保证它们是等效的。