Usando os.path de Python, ¿cómo subo a un directorio?

Resuelto hobbes3 asked hace 12 años • 17 respuestas

Recientemente actualicé Django de v1.3.1 a v1.4.

En mi viejo settings.pytengo

TEMPLATE_DIRS = (
    os.path.join(os.path.dirname( __file__ ), 'templates').replace('\\', '/'),
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
)

Esto apuntará a /Users/hobbes3/Sites/mysite/templates, pero debido a que Django v1.4 movió la carpeta del proyecto al mismo nivel que las carpetas de la aplicación , mi settings.pyarchivo ahora está en /Users/hobbes3/Sites/mysite/mysite/lugar de /Users/hobbes3/Sites/mysite/.

En realidad, mi pregunta ahora es doble:

  1. ¿Cómo suelo os.pathmirar un directorio un nivel superior a __file__. En otras palabras, quiero /Users/hobbes3/Sites/mysite/mysite/settings.pyencontrar /Users/hobbes3/Sites/mysite/templatesusando rutas relativas.
  2. ¿Debería mantener la templatecarpeta (que tiene plantillas para aplicaciones cruzadas, como admin, registrationetc.) en el /User/hobbes3/Sites/mysitenivel de proyecto o en /User/hobbes3/Sites/mysite/mysite?
hobbes3 avatar Mar 25 '12 06:03 hobbes3
Aceptado
os.path.abspath(os.path.join(os.path.dirname( __file__ ), '..', 'templates'))

En cuanto a dónde debería ir la carpeta de plantillas, no lo sé ya que acaba de salir Django 1.4 y aún no lo he visto. Probablemente deberías hacer otra pregunta sobre SE para resolver ese problema.

También puedes utilizar normpathpara limpiar la ruta, en lugar de abspath. Sin embargo, en esta situación, Django espera una ruta absoluta en lugar de una ruta relativa.

Para compatibilidad multiplataforma, utilice os.pardiren lugar de '..'.

forivall avatar Mar 24 '2012 23:03 forivall

Para obtener la carpeta de un archivo simplemente use:

os.path.dirname(path) 

Para abrir una carpeta, simplemente úsela os.path.dirnamenuevamente.

os.path.dirname(os.path.dirname(path))

Es posible que desee comprobar si __file__es un enlace simbólico:

if os.path.islink(__file__): path = os.readlink (__file__)
jassinm avatar Mar 24 '2012 23:03 jassinm