以防万一我错过了什么,然后才实施自己的解决方案。
在我们的构建系统中,我总是必须使用相对路径来保持所有项目的可移动性。因此,构建脚本应生成文件的相对路径。
但是,似乎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
实现无法正常工作?
答案 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