Использование ОС Python.путь, как мне подняться на один каталог?



недавно я обновил Django с v1.3.1 до v1.4.



в моем старом settings.py У меня есть



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


это будет указывать /Users/hobbes3/Sites/mysite/templates, а потому что Django v1. 4 переместил папку проекта на тот же уровень, что и папки приложения мой сейчас /Users/hobbes3/Sites/mysite/mysite/ вместо /Users/hobbes3/Sites/mysite/.



так что на самом деле мой вопрос теперь двоякий:




  1. как использовать os.path посмотреть в каталог на один уровень выше от __file__. В других слова, Я хочу!--8--> найти /Users/hobbes3/Sites/mysite/templates использование относительных путей.

  2. я должен держать template папка (которая имеет шаблоны кросс-приложений, например admin,registration и т. д.) на проекте

1224   9  

9 ответов:

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

Что касается того, куда должна идти папка templates, я не знаю, так как Django 1.4 только что вышел, и я еще не смотрел на него. Вероятно, вы должны задать еще один вопрос о SE, чтобы решить эту проблему.

вы также можете использовать normpath чтобы очистить путь, а не abspath. Однако в этой ситуации Django ожидает абсолютный путь, а не относительный путь.

для кросс-платформенной совместимости используйте os.pardir вместо '..'.

чтобы получить папку с файлом просто используйте:

os.path.dirname(path) 

чтобы получить папку просто использовать os.path.dirname снова

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

вы можете проверить, если __file__ - символическая ссылка:

if os.path.islink(__file__): path = os.readlink (__file__)

вы хотите именно этого:

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

обновление:

если вам случится "копировать"settings.py через символическую ссылку, ответ @forivall лучше:

~user/
    project1/  
        mysite/
            settings.py
        templates/
            wrong.html

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

метод выше будет 'видеть' wrong.html в то время как метод @forivall будет видеть right.html

в отсутствие символических ссылок два ответа идентичны.

лично я бы пошел на функциональный подход

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

current_dirs_parent = get_parent_dir(os.getcwd())

Я думаю, что проще всего сделать, это просто повторно использовать dirname() Так что вы можете позвонить

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

если файл находится в /Users/hobbes3/Sites/mysite/templates/method.py

это вернет "/ Users / hobbes3 / Sites / mysite"

Это может быть полезно для других случаев, где вы хотите пойти х папок. Просто беги walk_up_folder(path, 6) чтобы подняться на 6 папок.

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

Если вы используете Python 3.4 или новее, удобный способ перемещения вверх по нескольким каталогам -pathlib:

from pathlib import Path

full_path = "path/to/directory"
str(Path(full_path).parents[0])  # "path/to"
str(Path(full_path).parents[1])  # "path"
str(Path(full_path).parents[2])  # "."

для такого параноика, как я, я бы предпочел этот

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

Comments

    Ничего не найдено.