На всякий случай, если я что-то пропустил, и перед тем, как реализовать собственное решение проблемы.
В нашей системе сборки мне всегда приходится работать с относительными путями, чтобы все проекты были мобильными. Поэтому сценарии сборки должны генерировать относительные пути к файлам.
Все же кажется, что в библиотеке 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
не работает?