Получить родителя текущего каталога из скрипта Python

Я хочу получить родительский элемент текущего каталога из скрипта Python. Например, я запускаю скрипт из /home/kristina/desire-directory/scripts, путь желания в этом случае /home/kristina/desire-directory

Я знаю sys.path[0] от sys. Но я не хочу анализировать результирующую строку sys.path[0]. Есть ли другой способ получить родителя текущего каталога в Python?


person Fedorenko Kristina    schedule 13.05.2015    source источник


Ответы (6)


Использование os.path

Чтобы получить родительский каталог каталога, содержащего скрипт (независимо от текущего рабочего каталога), вам нужно использовать __file__.

Внутри скрипта используйте os.path.abspath(__file__) для получения абсолютного путь к скрипту и дважды вызовите os.path.dirname :

from os.path import dirname, abspath
d = dirname(dirname(abspath(__file__))) # /home/kristina/desire-directory

По сути, вы можете подняться по дереву каталогов, вызвав os.path.dirname столько раз, сколько необходимо. Пример:

In [4]: from os.path import dirname

In [5]: dirname('/home/kristina/desire-directory/scripts/script.py')
Out[5]: '/home/kristina/desire-directory/scripts'

In [6]: dirname(dirname('/home/kristina/desire-directory/scripts/script.py'))
Out[6]: '/home/kristina/desire-directory'

Если вы хотите получить родительский каталог текущего рабочего каталога, используйте os.getcwd:

import os
d = os.path.dirname(os.getcwd())

Использование библиотеки путей

Вы также можете использовать модуль pathlib (доступен в Python 3.4 или новее).

Каждый экземпляр pathlib.Path имеет атрибут parent, относящийся к родительскому каталогу, а также атрибут parents, который представляет собой список предков пути. Для получения абсолютного пути можно использовать Path.resolve. Он также разрешает все символические ссылки, но вместо этого вы можете использовать Path.absolute, если это нежелательное поведение.

Path(__file__) и Path() представляют собой путь к скрипту и текущий рабочий каталог соответственно, поэтому для получения родительского каталога каталога скрипта (независимо от текущего рабочего каталога) вы должны использовать

from pathlib import Path
# `path.parents[1]` is the same as `path.parent.parent`
d = Path(__file__).resolve().parents[1] # Path('/home/kristina/desire-directory')

и получить родительский каталог текущего рабочего каталога

from pathlib import Path
d = Path().resolve().parent

Обратите внимание, что d — это экземпляр Path, что не всегда удобно. Вы можете легко преобразовать его в str, когда вам это нужно:

In [15]: str(d)
Out[15]: '/home/kristina/desire-directory'
person vaultah    schedule 13.05.2015
comment
Path(__file__).resolve().parent -> Path(".").resolve(). Это также работает, когда нет __file__, потому что вы начали в интерактивном интерпретаторе. - person Navith; 13.05.2015
comment
если скрипт находится в папке /scripts, например, ‘/home/kristina/desire-directory/scripts/myScript.py’, первое решение не вернет желаемый каталог, вместо этого оно вернет /scripts - person LetsPlayYahtzee; 01.06.2016
comment
все остальные os.blabla не работают для меня, кроме этого решения. Большое большое спасибо! - person Tiến Nguyễn Hoàng; 05.07.2018
comment
from pathlib import Path BASE_DIR = Path(__file__).resolve().parent, это работает для меня - person Antti; 12.04.2021

Используйте Path.parent из модуля pathlib:

from pathlib import Path

# ...

Path(__file__).parent

Вы можете использовать несколько вызовов parent, чтобы пройти дальше по пути:

Path(__file__).parent.parent
person Gavriel Cohen    schedule 21.09.2016

Это сработало для меня (я на Ubuntu):

import os
os.path.dirname(os.getcwd())
person akashbw    schedule 29.04.2016

'..' возвращает родителя текущего каталога.

import os
os.chdir('..')

Теперь ваш текущий каталог будет /home/kristina/desire-directory.

person marcin    schedule 14.11.2018

Вы можете просто использовать ../your_script_name.py Например, предположим, что путь к вашему скрипту Python — trading system/trading strategies/ts1.py. Чтобы обратиться к volume.csv, расположенному в trading system/data/. Вам просто нужно обратиться к нему как ../data/volume.csv

person Yanqi Huang    schedule 09.03.2019

import os def parent_directory(): # Создать относительный путь к родительскому # текущего рабочего каталога path = os.getcwd() parent = os.path.dirname(path)

relative_parent = os.path.join(path, parent)

# Return the absolute path of the parent directory
return relative_parent

печать (родительский_каталог())

person rajab ssemwogerere    schedule 03.08.2020