Использование ОС 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/.
так что на самом деле мой вопрос теперь двоякий:
- как использовать
os.pathпосмотреть в каталог на один уровень выше от__file__. В других слова, Я хочу!--8--> найти/Users/hobbes3/Sites/mysite/templatesиспользование относительных путей. - я должен держать
templateпапка (которая имеет шаблоны кросс-приложений, напримерadmin,registrationи т. д.) на проекте
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__)
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