web-dev-qa-db-fra.com

python: obtenir le répertoire deux niveaux plus haut

Ok ... Je ne sais pas où se trouve le module x, mais je sais que je dois obtenir le chemin d'accès au répertoire deux niveaux plus haut.

Alors, y a-t-il une manière plus élégante de faire:

import os
two_up = os.path.dirname(os.path.dirname(__file__))

Les solutions pour Python 2 et 3 sont les bienvenues!

50
jramm

Vous pouvez utiliser pathlib . Malheureusement, cela n’est disponible que dans stdlib pour Python 3.4. Si vous avez une version plus ancienne, vous devrez installer une copie de PyPI ici . Cela devrait être facile à faire en utilisant pip.

from pathlib import Path

p = Path(__file__).parents[1]

print(p)
# /absolute/path/to/two/levels/up

Ceci utilise la séquence parents qui donne accès aux répertoires parents et choisit le deuxième répertoire.

Notez que p dans ce cas sera une forme d'objet Path, avec leurs propres méthodes. Si vous avez besoin des chemins en tant que chaîne, vous pouvez appeler str sur eux.

59
Ffisegydd

Très facile:

Voici ce que tu veux:

import os.path as path

two_up =  path.abspath(path.join(__file__ ,"../.."))

Cordialement Sebi

25
Sebi2020

J'allais ajouter cela juste pour être stupide, mais aussi parce que cela montrait aux nouveaux arrivants l'utilité potentielle des fonctions de création d'alias et/ou d'importation.

Après l'avoir écrit, je pense que ce code est plus lisible (c'est-à-dire qu'il prend moins de temps pour saisir l'intention) que les autres réponses à ce jour, et la lisibilité est (généralement) essentielle.

from os.path import dirname as up

two_up = up(up(__file__))

Remarque: vous ne souhaitez effectuer ce type de tâche que si votre module est très petit ou cohérent par rapport au contexte.

18
andyhasit

Pour obtenir le répertoire 2 niveaux:

 import os.path as path
 two_up = path.abspath(path.join(os.getcwd(),"../.."))
6
zerocog

Personnellement, je trouve que l'utilisation du module os est la méthode la plus simple, comme indiqué ci-dessous. Si vous ne montez que d'un niveau, remplacez ('../ ..') par ('..').

    import os
    os.chdir('../..')

--Check:
    os.getcwd()
3
M. Murphy

J'ai trouvé que ce qui suit fonctionne bien dans 2.7.x

import os
two_up = os.path.normpath(os.path.join(__file__,'../'))
2
Lucidious

La meilleure solution (pour python> = 3.4) lors de l'exécution depuis n'importe quel répertoire est:

from pathlib import Path
two_up = Path(__file__).resolve().parents[1]
2
pythinker

Une implémentation plus multi-plateforme sera:

import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()

L'utilisation de parent n'est pas prise en charge sous Windows. Il faut aussi ajouter .resolve(), à: 

Rendre le chemin absolu, en résolvant tous les liens symboliques et en le normalisant (par exemple, transformer les barres obliques en barres obliques inverses sous Windows)

0
Artem Zhukov

Vous pouvez l'utiliser comme une solution générique:

import os

def getParentDir(path, level=1):
  return os.path.normpath( os.path.join(path, *([".."] * level)) )
0
Axel Heider