ruta relativa paquetes modulos lista librerias libreria especificar directorio como basicas actual python django

relativa - Usando os.path de Python, ¿cómo puedo subir un directorio?



python directorio actual (8)

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 archivo settings.py ahora está en /Users/hobbes3/Sites/mysite/mysite/ lugar de /Users/hobbes3/Sites/mysite/ .

Entonces mi pregunta ahora es doble:

  1. ¿Cómo utilizo os.path para mirar un directorio de nivel superior desde __file__ . En otras palabras, quiero que /Users/hobbes3/Sites/mysite/mysite/settings.py encuentre /Users/hobbes3/Sites/mysite/templates usando rutas relativas.
  2. ¿Debería mantener la carpeta de la template (que tiene plantillas de aplicaciones cruzadas, como admin , registration , etc.) en el proyecto /User/hobbes3/Sites/mysite nivel de /User/hobbes3/Sites/mysite o en /User/hobbes3/Sites/mysite/mysite ?

Creo que lo más fácil es reutilizar dirname () para que pueda llamar

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

si el archivo se encuentra en /Users/hobbes3/Sites/mysite/templates/method.py

Esto devolverá "/ Users / hobbes3 / Sites / mysite"


Esto podría ser útil para otros casos en los que desee ir x carpetas arriba. Simplemente ejecute walk_up_folder(path, 6) para subir 6 carpetas.

def walk_up_folder(path, depth=1): _cur_depth = 1 while _cur_depth < depth: path = os.path.dirname(path) _cur_depth += 1 return path


Para obtener la carpeta de un archivo simplemente use:

os.path.dirname(path)

Para obtener una carpeta simplemente use os.path.dirname otra vez

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__)


Para un paranoico como yo, preferiría este

TEMPLATE_DIRS = ( __file__.rsplit(''/'', 2)[0] + ''/templates'', )


Personalmente, iría por el enfoque de función

def get_parent_dir(directory): import os return os.path.dirname(directory) current_dirs_parent = get_parent_dir(os.getcwd())


Quieres exactamente esto:

BASE_DIR = os.path.join( os.path.dirname( __file__ ), ''..'' )


from os.path import dirname, realpath, join join(dirname(realpath(dirname(__file__))), ''templates'')

Actualizar:

Si sucede que "copias" de settings.py través de un enlace simbólico, la respuesta de @ forivall es mejor:

~user/ project1/ mysite/ settings.py templates/ wrong.html project2/ mysite/ settings.py -> ~user/project1/settings.py templates/ right.html

El método anterior ''verá'' wrong.html mientras que el método de @ forivall verá right.html

En ausencia de enlaces simbólicos, las dos respuestas son idénticas.


os.path.abspath(os.path.join(os.path.dirname( __file__ ), ''..'', ''templates''))

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

También puede usar normpath para limpiar el camino, en lugar de abspath . Sin embargo, en esta situación, Django espera una ruta absoluta en lugar de una ruta relativa.

Para la compatibilidad de plataformas cruzadas, use os.pardir lugar de ''..'' .