Usando os.path de Python, ¿cómo subo a un directorio?
Recientemente actualicé Django de v1.3.1 a v1.4.
En mi viejo settings.py
tengo
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.py
archivo ahora está en /Users/hobbes3/Sites/mysite/mysite/
lugar de /Users/hobbes3/Sites/mysite/
.
En realidad, mi pregunta ahora es doble:
- ¿Cómo suelo
os.path
mirar un directorio un nivel superior a__file__
. En otras palabras, quiero/Users/hobbes3/Sites/mysite/mysite/settings.py
encontrar/Users/hobbes3/Sites/mysite/templates
usando rutas relativas. - ¿Debería mantener la
template
carpeta (que tiene plantillas para aplicaciones cruzadas, comoadmin
,registration
etc.) en el/User/hobbes3/Sites/mysite
nivel de proyecto o en/User/hobbes3/Sites/mysite/mysite
?
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 normpath
para 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.pardir
en lugar de '..'
.
Para obtener la carpeta de un archivo simplemente use:
os.path.dirname(path)
Para abrir una carpeta, simplemente úsela os.path.dirname
nuevamente.
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__)