web-dev-qa-db-fra.com

Comment obtenir l'emplacement du répertoire parent

ce code est obtenir les modèles/blog1/page.html dans b.py:

path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))

mais je veux obtenir l'emplacement du répertoire parent:

aParent
   |--a
   |  |---b.py
   |      |---templates
   |              |--------blog1
   |                         |-------page.html
   |--templates
          |--------blog1
                     |-------page.html

et comment se rendre aParent

merci

mis à jour:

c'est juste:

dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))

ou

path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
120
zjm1126

Vous pouvez appliquer plusieurs fois dirname pour monter plus haut: dirname(dirname(file)). Cela ne peut cependant aller que jusqu'au paquet racine. Si cela pose un problème, utilisez os.path.abspath: dirname(dirname(abspath(file))).

154
Marcelo Cantos

os.path.abspath Ne valide rien, donc si nous ajoutons déjà des chaînes à __file__, Vous n'avez pas besoin de vous embêter avec dirname ni de rejoindre, ni rien de tout cela. Traitez simplement __file__ Comme un répertoire et commencez à grimper:

# climb to __file__'s parent's parent:
os.path.abspath(__file__ + "/../../")

C'est beaucoup moins compliqué que os.path.abspath(os.path.join(os.path.dirname(__file__),"..")) et à peu près aussi facile à gérer que dirname(dirname(__file__)). Monter à plus de deux niveaux commence à devenir ridicule.

Mais, puisque nous savons combien de niveaux à gravir, nous pourrions résoudre cela avec une simple petite fonction:

uppath = lambda _path, n: os.sep.join(_path.split(os.sep)[:-n])

# __file__ = "/aParent/templates/blog1/page.html"
>>> uppath(__file__, 1)
'/aParent/templates/blog1'
>>> uppath(__file__, 2)
'/aParent/templates'
>>> uppath(__file__, 3)
'/aParent'
53
joemaller

Utilisez le chemin relatif avec le module pathlib dans Python 3.4+ :

from pathlib import Path

Path(__file__).parent

Vous pouvez utiliser plusieurs appels à parent pour aller plus loin dans le chemin:

Path(__file__).parent.parent

Au lieu de spécifier deux fois parent, vous pouvez utiliser:

Path(__file__).parents[1]
28
Gavriel Cohen
os.path.dirname(os.path.abspath(__file__))

Devrait vous donner le chemin vers a.

Mais si b.py est le fichier en cours d’exécution, alors vous pouvez obtenir le même résultat en faisant simplement

os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
11
Felix Kling

os.pardir est un meilleur moyen pour ../ et plus lisible.

import os
print os.path.abspath(os.path.join(given_path, os.pardir))  

Ceci renverra le chemin parent du donnée

9
Sun Liwen

Un moyen simple peut être:

import os
current_dir =  os.path.abspath(os.path.dirname(__file__))
parent_dir = os.path.abspath(current_dir + "/../")
print parent_dir
5
Muneeb Ali

Utilisez ce qui suit pour accéder au dossier précédent:

os.chdir(os.pardir)

Si vous avez besoin de plusieurs sauts, une solution simple et efficace consiste à utiliser un simple décorateur dans ce cas.

3
Marco smdm

Peut être rejoindre deux .. dossier, pour obtenir le parent du dossier parent?

path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"..",".."))
3
YOU

Voici une autre solution relativement simple qui:

  • n'utilise pas dirname() (ce qui ne fonctionne pas comme prévu avec des arguments d'un niveau comme "fichier.txt" ou des parents relatifs comme "..")
  • n'utilise pas abspath() (évitant toute hypothèse sur le répertoire de travail en cours) mais conserve le caractère relatif des chemins

il utilise simplement normpath et join:

def parent(p):
    return os.path.normpath(os.path.join(p, os.path.pardir))

# Example:
for p in ['foo', 'foo/bar/baz', 'with/trailing/slash/', 
        'dir/file.txt', '../up/', '/abs/path']:
    print parent(p)

Résultat:

.
foo/bar
with/trailing
dir
..
/abs
1
Stefaan

J'ai essayé:

import os
os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))
0
user260826

Je pense utiliser c'est mieux:

os.path.realpath(__file__).rsplit('/', X)[0]


In [1]: __file__ = "/aParent/templates/blog1/page.html"

In [2]: os.path.realpath(__file__).rsplit('/', 3)[0]
Out[3]: '/aParent'

In [4]: __file__ = "/aParent/templates/blog1/page.html"

In [5]: os.path.realpath(__file__).rsplit('/', 1)[0]
Out[6]: '/aParent/templates/blog1'

In [7]: os.path.realpath(__file__).rsplit('/', 2)[0]
Out[8]: '/aParent/templates'

In [9]: os.path.realpath(__file__).rsplit('/', 3)[0]
Out[10]: '/aParent'
0
dongweiming