Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Внутри script используйте os.path.abspath(__file__), чтобы получить абсолютный путь script, и вызовите 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

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

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

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

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'

Ответ 2

import os
current_file = os.path.abspath(os.path.dirname(__file__))
parent_of_parent_dir = os.path.join(current_file, '../../')

Ответ 3

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

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

Ответ 4

Вы можете использовать Path.parent из модуля pathlib:

from pathlib import Path

# ...

Path(__file__).parent

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

Path(__file__).parent.parent

Ответ 5

from os.path import dirname
from os.path import abspath

def get_file_parent_dir_path():
    """return the path of the parent directory of current file directory """
    current_dir_path = dirname(abspath(__file__))
    path_sep = os.path.sep
    components = current_dir_path.split(path_sep)
    return path_sep.join(components[:-1])