使用父目录步骤创建相对路径

时间:2018-09-17 17:36:34

标签: python python-3.7 pathlib

以防万一我错过了什么,然后才实施自己的解决方案。

在我们的构建系统中,我总是必须使用相对路径来保持所有项目的可移动性。因此,构建脚本应生成文件的相对路径。

但是,似乎python库中没有函数,该函数可以处理父路径步骤,如以下示例所示:

from pathlib import Path
dir_a = Path("/home/example/solution/project")
file_b = Path("/home/example/solution/config.h")

相对于file_b,我想获得到dir_a的路径。因此,如果我从dir_a开始,相对路径将指向file_b

最好的结果是:

>>> file_b.relative_to(dir_a)
Path("../config.h")

以这个稍微复杂的示例为例:

from pathlib import Path
dir_a = Path("/home/example/solution/project_a")
file_b = Path("/home/example/solution/project_b/config.h")

最好的结果是:

>>> file_b.relative_to(dir_a)
Path("../project_b/config.h")

使用.relative_to方法的两个示例都不起作用,并引发异常:

ValueError: '/home/example/solution/project_b/config.h' does not start with '/home/example/solution/project_a'

os.path.relpath方法可以正常工作,但是返回字符串而不是Path对象:

>>> os.path.relpath(file_b, dir_a)
'../project_b/config.h'

所以我想知道我是否在这里错过了什么...

如何使用Path对象获取父目录的相对路径?

为什么relative_to对象的Path实现无法正常工作?

1 个答案:

答案 0 :(得分:0)

某些路径x必须位于某个基本路径内。您会遇到ValueError异常,因为project_b并非相对于project_a,而是相对于解决方案文件夹。

例如,为了更好地理解,您应该具有:

base = Path("/home/example/solution")
b_file = Path("/home/example/solution/project_b/config.h")
b_file.relative_to(base) # output >>> WindowsPath('project_b/config.h')

编辑: 您可以使用Path.glob()Path.iterdir()使用Path对象在当前文件夹中获得相对目录。

您将找出最适合您的情况的一个。

基本上,您可以做的是:

base = Path('/home/example/solution') 
g = base.glob('/*') # grabs all files and dirs relative to the current folder as Path objects
try:
    while g:
        i = next(g)
        if i.match('project_b'):
            # if here is my folder then work with it
            b_file = i.joinpath('config.h')
        else:
            # work on a better look up maybe
            pass
except StopIteration:
    pass