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:
- ¿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. - ¿Debería mantener la carpeta de la
template
(que tiene plantillas de aplicaciones cruzadas, comoadmin
,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 ''..''
.