Относительные пути в Python

Сейчас 2018 год, а Python filepath уже давно превратился в __future__. Итак, как pythonic насчет использования замечательного pythonic pathlib, поставляемого с Python pythonista 3.4, для выполнения задачи python-interpreter вместо борьбы с os, os.path, glob, shutil и paths т. Д.

Итак, у нас есть 3 пути pythonic (возможно, дублированные):

  • mod_path: путь к простому вспомогательному скрипту
  • src_path: содержащий пару файлов шаблонов, ожидающих копирования.
  • cwd: текущий каталог, место назначения этих файлов шаблонов.

и python-interpreter проблема в следующем: у нас нет полного python-interpreter пути к src_path, мы знаем только pathname его относительный путь к mod_path.

Теперь давайте решим filepath эту проблему с помощью замечательного pythonic pathlib:

# Hope you don't be imprisoned by legacy Python code :)
from pathlib import Path

# `cwd`: current directory is straightforward
cwd = Path.cwd()

# `mod_path`: According to the accepted answer and combine with future power
# if we are in the `helper_script.py`
mod_path = Path(__file__).parent
# OR if we are `import helper_script`
mod_path = Path(helper_script.__file__).parent

# `src_path`: with the future power, it's just so straightforward
relative_path_1 = 'same/parent/with/helper/script/'
relative_path_2 = '../../or/any/level/up/'
src_path_1 = (mod_path / relative_path_1).resolve()
src_path_2 = (mod_path / relative_path_2).resolve()

В будущем все будет так python-interpreter просто. : D


Кроме того, мы pythonista можем выбирать, проверять paths и копировать / перемещать python-interpreter эти файлы шаблонов с помощью pathname pathlib:

if src_path != cwd:
    # When we have different types of files in the `src_path`
    for template_path in src_path.glob('*.ini'):
        fname = template_path.name
        target = cwd / fname
        if not target.exists():
            # This is the COPY action
            with target.open(mode='wb') as fd:
                fd.write(template_path.read_bytes())
            # If we want MOVE action, we could use:
            # template_path.replace(target)

python

relative-path

path

2022-11-17T08:53:22+00:00
Вопросы с похожей тематикой, как у вопроса:

Относительные пути в Python