Создать относительный путь с помощью шагов родительских каталогов
На всякий случай я что-то упустил и прежде чем я реализую собственное решение проблемы.
В нашей системе сборки мне всегда приходится работать с относительными путями, чтобы все проекты были мобильными. Поэтому сценарии сборки должны генерировать относительные пути к файлам.
Тем не менее кажется, что в библиотеке 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 ответ
Некоторый путь 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
объекты, использующие либо Path.glob()
или же Path.iterdir()
,
Вы собираетесь выяснить, какой из них лучше подходит вашему делу.
По сути, вы можете сделать это:
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