Что такое os.path.abspath(os.path.join(os.path.dirname(__ file__), os.path.pardir)) означает? питон

В нескольких вопросах SO есть эти строки для доступа к родительскому каталогу кода, например. os.path.join(os.path.dirname(__ file__)) ничего не возвращает и os.path.join(os. path.dirname(__ file__)) ничего не возвращает

import os, sys
parentddir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path.append(parentddir)

Я понимаю, что os.path.abspath() возвращает абсолютный путь чего-либо, а sys.path.append() добавляет путь для доступа к коду. но что это за критическая строка ниже, что это значит?

os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))

Есть ли другой способ достижения той же цели добавления родительского каталога кода где?

Эта проблема возникает из-за того, что я вызываю функции по каталогам, и иногда они имеют одинаковое имя файла, например. script1/utils.py и script2/utils.py. Я вызываю функцию из script1/test.py, которая вызывает script2/something.py, содержит функцию, которая вызывает script2/utils.py и следующий код

script1/
        utils.py
        src/
            test.py

script2/
        utils.py
        code/
            something.py

test.py

from script2.code import something
import sys
sys.path.append('../')
import utils

something.foobar()

something.py

import os, sys
parentddir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))
sys.path.append(parentddir)
import utils

def foobar():
  utils.somefunc()

Ответ 1

Это умный способ ссылаться на пути независимо от местоположения скрипта. Та загадочная строка, на которую вы ссылаетесь:

os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))

Существует 3 метода и 2 константы:

  1. abspath возвращает абсолютный путь
  2. join присоединиться к строке пути
  3. dirname возвращает каталог файла
  4. __file__ относится к имени файла script
  5. pardir возвращает представление родительского каталога в ОС (обычно ..)

Таким образом, выражение возвращает полный путь к исполняемому скрипту безопасным для нескольких платформ способом. Не нужно запутывать какие-либо указания, вот почему это так полезно.

Могут быть и другие подходы для получения родительского каталога, в котором находится файл, например, программы имеют концепцию текущего рабочего каталога os.getcwd(). Так что os.getcwd()+'/..' может сработать. Но это очень опасно, потому что рабочие каталоги могут быть изменены.

Кроме того, если файл предназначен для импорта, рабочий каталог будет указывать на импортируемый файл, а не на импортируемый, но __file__ всегда указывает на фактический файл модуля, поэтому он безопаснее.

Надеюсь это поможет!

Редактировать: PS - Python 3 значительно упрощает эту ситуацию, позволяя нам обрабатывать пути объектно-ориентированным образом, поэтому приведенная выше строка становится:

from pathlib import Path
Path(__file__).resolve().parent.parent

Ответ 2

__file__ представляет файл, выполняемый кодом из

os.path.dirname(__file__) предоставляет каталог, в котором находится файл

os.path.pardir означает "..", что означает один каталог над текущим

os.path.join(os.path.dirname(__file__), os.path.pardir) объединяет имя каталога и ".."

os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)) разрешает вышеуказанный путь и дает вам абсолютный путь для родительского каталога каталога, в котором находится ваш файл