este código es obtener las plantillas / blog1 / page.html en b.py:
path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))
pero quiero obtener la ubicación del directorio principal:
aParent
|--a
| |---b.py
| |---templates
| |--------blog1
| |-------page.html
|--templates
|--------blog1
|-------page.html
y cómo obtener la ubicación de un padre
Gracias
actualizado:
esto es correcto:
dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))
o
path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
blog1
oa
? ¿Y dónde se encuentra su archivo actual?os.path.join('templates', 'blog1/page.html')
me parece extraño Estás mezclando cosas. Ya seaos.path.join('templates', 'blog1', 'page.html')
o'templates/blog1/page.html'
. Y mucho más fácil seríaos.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
entoncesRespuestas:
Puede aplicar nombredir varias veces para subir más alto:
dirname(dirname(file))
. Sin embargo, esto solo puede llegar hasta el paquete raíz. Si esto es un problema, utiliceos.path.abspath
:dirname(dirname(abspath(file)))
.fuente
dirname
. No es obvio para todos que aplicar dirname a un directorio produce el directorio padre.dirname
no no siempre volver al directorio padre; twitter.com/#!/ActiveState/status/671049326788608/
no representa la entrada del directorio hoja en sí, sino su contenido, por lo que, por ejemplo,mv xxx yyy/
falla siyyy
no es un directorio preexistente. En cualquier caso, incluso si tomamos su punto como dado, es irrelevante en el contexto de mi respuesta. Nifile
el resultado dedirname
nunca terminará en a/
.dirname
puede regresar'/'
, lo que claramente termina en a/
. Esa es la única excepción, AFAIK.os.path.abspath
no valida nada, así que si ya estamos agregando cadenas__file__
no hay necesidad de molestarsedirname
o unirse o nada de eso. Simplemente trátelo__file__
como un directorio y comience a escalar:Eso es mucho menos complicado
os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
y casi tan manejable comodirname(dirname(__file__))
. Subir más de dos niveles comienza a ser ridículo.Pero, dado que sabemos cuántos niveles subir, podríamos limpiar esto con una pequeña función simple:
fuente
os.path.abspath(os.path.join(__file__, "..", "..")
Sería más portátil?Use la ruta relativa con el
pathlib
módulo en Python 3.4+:Puede usar varias llamadas
parent
para ir más lejos en el camino:Como alternativa a especificar
parent
dos veces, puede usar:fuente
str(Path(__file__).parent)
.Debería darte el camino hacia
a
.Pero si
b.py
es el archivo que se está ejecutando actualmente, entonces puede lograr lo mismo simplemente haciendofuente
dirname()
dos veces Todo lo que necesita ahora debe estar en este sitio.os.pardir
Es una mejor manera../
y más legible.Esto devolverá la ruta principal de la ruta dada
fuente
Una forma simple puede ser:
fuente
Se puede unir dos
..
carpetas, para obtener el padre de la carpeta principal?fuente
Use lo siguiente para saltar a la carpeta anterior:
Si necesita varios saltos, una solución buena y fácil será usar un decorador simple en este caso.
fuente
Aquí hay otra solución relativamente simple que:
dirname()
(que no funciona como se esperaba en argumentos de un nivel como "file.txt" o padres relativos como "..")abspath()
(evitando cualquier suposición sobre el directorio de trabajo actual) sino que conserva el carácter relativo de las rutassolo usa
normpath
yjoin
:Resultado:
fuente
Creo que usar esto es mejor:
fuente
Lo intenté:
fuente