Создать относительный путь с помощью шагов родительских каталогов

На всякий случай я что-то упустил и прежде чем я реализую собственное решение проблемы.

В нашей системе сборки мне всегда приходится работать с относительными путями, чтобы все проекты были мобильными. Поэтому сценарии сборки должны генерировать относительные пути к файлам.

Тем не менее кажется, что в библиотеке 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
Другие вопросы по тегам