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__),".."))

blog1oa? ¿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.dirnameno 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 siyyyno es un directorio preexistente. En cualquier caso, incluso si tomamos su punto como dado, es irrelevante en el contexto de mi respuesta. Nifileel resultado dedirnamenunca terminará en a/.dirnamepuede regresar'/', lo que claramente termina en a/. Esa es la única excepción, AFAIK.os.path.abspathno valida nada, así que si ya estamos agregando cadenas__file__no hay necesidad de molestarsedirnameo 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
pathlibmódulo en Python 3.4+:Puede usar varias llamadas
parentpara ir más lejos en el camino:Como alternativa a especificar
parentdos veces, puede usar:fuente
str(Path(__file__).parent).Debería darte el camino hacia
a.Pero si
b.pyes 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.pardirEs 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
normpathyjoin:Resultado:
fuente
Creo que usar esto es mejor:
fuente
Lo intenté:
fuente