ce code est récupéré les templates / 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 obtenir l'emplacement aParent
Merci
actualisé:
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__),".."))
blog1
oua
? Et où se trouve votre fichier actuel?os.path.join('templates', 'blog1/page.html')
me semble étrange. Vous mélangez les choses. Soitos.path.join('templates', 'blog1', 'page.html')
ou'templates/blog1/page.html'
. Et beaucoup plus facile seraitos.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
alorsRéponses:
Vous pouvez appliquer dirname à plusieurs reprises pour monter plus haut:
dirname(dirname(file))
. Cependant, cela ne peut aller que jusqu'au package racine. Si cela est un problème, utilisezos.path.abspath
:dirname(dirname(abspath(file)))
.la source
dirname
. Il n'est pas évident pour tout le monde que l'application de dirname à un répertoire donne le répertoire parent.dirname
ne retourne PAS toujours le répertoire parent; twitter.com/#!/ActiveState/status/671049326788608/
par ne représente pas l'entrée du répertoire feuille elle-même, mais son contenu, c'est pourquoi, par exemple,mv xxx yyy/
échoue si ceyyy
n'est pas un répertoire préexistant. En tout cas, même si nous prenons votre argument pour acquis, il n’est pas pertinent dans le contexte de ma réponse. Nifile
ni le résultat dedirname
ne se terminera jamais par un/
.dirname
peut revenir'/'
, ce qui se termine clairement par un/
. C'est la seule exception, AFAIK.os.path.abspath
ne valide rien, donc si nous ajoutons déjà des chaînes,__file__
il n'est pas nécessaire de s'embêter avecdirname
ou de rejoindre ou de tout cela. Traitez simplement__file__
comme un répertoire et commencez à grimper:C'est beaucoup moins compliqué
os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
et à peu près aussi gérable quedirname(dirname(__file__))
. Grimper sur plus de deux niveaux commence à devenir ridicule.Mais, puisque nous savons combien de niveaux monter, nous pourrions nettoyer cela avec une petite fonction simple:
la source
os.path.abspath(os.path.join(__file__, "..", "..")
plus portable?Utilisez le chemin relatif avec le
pathlib
module dans Python 3.4+:Vous pouvez utiliser plusieurs appels à
parent
pour aller plus loin dans le chemin:Au lieu de spécifier
parent
deux fois, vous pouvez utiliser:la source
str(Path(__file__).parent)
.Devrait vous donner le chemin vers
a
.Mais si
b.py
le fichier est actuellement exécuté, vous pouvez obtenir la même chose en faisant simplementla source
dirname()
deux fois. Tout ce dont vous avez besoin maintenant devrait être sur ce site.os.pardir
est un meilleur moyen../
et plus lisible.Cela retournera le chemin parent du chemin donné
la source
Un moyen simple peut être:
la source
Peut-être joindre deux
..
dossiers, pour obtenir le parent du dossier parent?la source
Utilisez ce qui suit pour passer au dossier précédent:
Si vous avez besoin de plusieurs sauts, une bonne et simple solution sera d'utiliser un simple décorateur dans ce cas.
la source
Voici une autre solution relativement simple qui:
dirname()
(ce qui ne fonctionne pas comme prévu sur des arguments d'un niveau comme "file.txt" ou des parents relatifs comme "..")abspath()
(évitant toute hypothèse sur le répertoire de travail courant) mais préserve à la place le caractère relatif des cheminsil utilise juste
normpath
etjoin
:Résultat:
la source
Je pense que c'est mieux de l'utiliser:
la source
J'ai essayé:
la source