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!
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.
Très facile:
Voici ce que tu veux:
import os.path as path
two_up = path.abspath(path.join(__file__ ,"../.."))
Cordialement Sebi
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.
Pour obtenir le répertoire 2 niveaux:
import os.path as path
two_up = path.abspath(path.join(os.getcwd(),"../.."))
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()
J'ai trouvé que ce qui suit fonctionne bien dans 2.7.x
import os
two_up = os.path.normpath(os.path.join(__file__,'../'))
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]
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)
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)) )