Что такое 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 константы:
-
abspath
возвращает абсолютный путь -
join
присоединиться к строке пути -
dirname
возвращает каталог файла -
__file__
относится к имени файла script
-
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))
разрешает вышеуказанный путь и дает вам абсолютный путь для родительского каталога каталога, в котором находится ваш файл