Obtener padre del directorio actual desde el script Python


Quiero obtener el padre del directorio actual del script Python. Por ejemplo, lanzo el script desde /home/kristina/desire-directory/scripts la ruta del deseo en este caso es /home/kristina/desire-directory

sys.path[0] de sys. Pero no quiero analizar sys.path[0] la cadena resultante. ¿Hay alguna otra forma de obtener el padre del directorio actual en Python?

Author: vaultah, 2015-05-13

5 answers

Usando so.path

Para obtener el directorio padre del directorio que contiene el script (independientemente del directorio de trabajo actual), necesitará usar __file__.

Dentro del uso del scriptos.path.abspath(__file__) para obtener la ruta absoluta del script, y llamar os.path.dirname dos veces:

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

Básicamente, puede subir por el árbol de directorios llamando a os.path.dirname tantas veces como sea necesario. Ejemplo:

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'

Si desea obtener el padre directorio del directorio de trabajo actual , use os.getcwd:

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

Usando pathlib

También podría utilizar el pathlib módulo (disponible en Python 3.4 o posterior).

Cada instancia pathlib.Path tiene el atributo parent que se refiere al directorio padre, así como el atributo parents, que es una lista de ancestros de la ruta. Path.resolve se puede utilizar para obtener la ruta absoluta. También resuelve todos los enlaces simbólicos, pero puede usar Path.absolute en su lugar si ese no es un comportamiento deseado.

Path(__file__) y Path() representan la ruta del script y el directorio de trabajo actual respectivamente, por lo tanto, para obtener el directorio padre del directorio de script (independientemente del directorio de trabajo actual) usaría

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')

Y para obtener el directorio padre del directorio de trabajo actual

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

Tenga en cuenta que d es una instancia Path, que no siempre es útil. Puede convertirlo a str fácilmente cuando lo necesite:

In [15]: str(d)
Out[15]: '/home/kristina/desire-directory'
 48
Author: vaultah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-30 21:32:57

Esto funcionó para mí (estoy en Ubuntu):

import os
os.path.dirname(os.getcwd())
 6
Author: akashbw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-29 13:10:57
import os
current_file = os.path.abspath(os.path.dirname(__file__))
parent_of_parent_dir = os.path.join(current_file, '../../')
 4
Author: corvid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-13 15:51:49

Puedes usar Path.parent desde el módulo pathlib:

from pathlib import Path

# ...

Path(__file__).parent

Puedes usar múltiples llamadas a parent para ir más allá en la ruta:

Path(__file__).parent.parent
 4
Author: Gavriel Cohen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-21 14:41:47
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's 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])
 0
Author: beingzy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-10 16:54:45