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.pathpara mirar un directorio de nivel superior desde__file__. En otras palabras, quiero que/Users/hobbes3/Sites/mysite/mysite/settings.pyencuentre/Users/hobbes3/Sites/mysite/templatesusando 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/mysitenivel de/User/hobbes3/Sites/mysiteo 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 ''..'' .