我最近把Django从v1.3.1升级到了v1.4。

在我的旧设置。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将项目文件夹移动到与应用文件夹相同的级别,我的settings.py文件现在在/Users/hobbes3/Sites/mysite/而不是/Users/hobbes3/Sites/mysite/。

所以实际上我的问题是双重的

如何使用操作系统。查看__file__上一级目录的路径。换句话说,我想要/Users/hobbes3/Sites/mysite/ settings.py使用相对路径找到/Users/hobbes3/Sites/mysite/templates。 我应该保持模板文件夹(其中有跨应用模板,如管理,注册等)在项目/User/hobbes3/Sites/mysite级别或在/User/hobbes3/Sites/mysite/mysite?


当前回答

就我个人而言,我倾向于函数方法

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"

你想要的就是:

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

不是一个回答,而是一个很长很切题的评论,可能有人会被引入歧途。

os.path语法。加入(os.path。Dirname (__file__), 'foo.txt')在运行python文件的同一文件夹中获取一个文件并不是包的“建议”解决方案,相反,出于几个原因,包数据是首选的,例如在zip打包包或更复杂的文件系统中。

pkg_resources。Read_text (__package__, 'foo.txt')是以前推荐的解决方案,但在某些时候将被删除,importlib.resources. txt将被删除。Read_text (__package__, 'foo.txt')是推荐的方法-查看https://docs.python.org/3/library/importlib.html#module-importlib.resources的许多选项。 然而,这

需要include_package_data=True和package_data的Dict[str, List[str]在setup.py文件 需要舱单。在if PIP分发为sdist(但不是一个内置的轮子) 对于相对导入无效(即未安装) 在web应用程序中,由于它们的运行方式而被明智地忽略了吗

要向上移动n个文件夹…运行了(n)

import os

def up(n, nth_dir=os.getcwd()):
    while n != 0:
        nth_dir = os.path.dirname(nth_dir)
        n -= 1
    return nth_dir

要获取一个文件的文件夹,只需使用:

os.path.dirname(path) 

要创建文件夹,再次使用os.path.dirname即可

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

你可能想检查__file__是否是一个符号链接:

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