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__),".."))
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)))
.
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'
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]
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'))
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
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
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.
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__)),"..",".."))
Voici une autre solution relativement simple qui:
dirname()
(ce qui ne fonctionne pas comme prévu avec des arguments d'un niveau comme "fichier.txt" ou des parents relatifs comme "..")abspath()
(évitant toute hypothèse sur le répertoire de travail en cours) mais conserve le caractère relatif des cheminsil 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
J'ai essayé:
import os
os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))
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'