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
Sé 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?
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'
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())
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, '../../')
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
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])
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