django os.path.dirname(os.path.abspath(__file__))和os.path.dirname(__file__)之间的区别

ep6jt1vc  于 2023-10-21  发布在  Go
关注(0)|答案(2)|浏览(115)

Django项目的settings.py文件包含以下两行:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

我想知道两者的区别,因为我认为两者都指向同一个目录。另外,如果你能提供一些链接操作系统的路径函数,这将是很大的帮助。

9avjhtql

9avjhtql1#

BASE_DIR指向PROJECT_ROOT的父目录。您可以将这两个定义重写为:

PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.dirname(PROJECT_ROOT)

因为os.path.dirname()函数只是删除路径的最后一段。
在上面,__file__名称指向当前模块的文件名,参见Python datamodel
__file__是加载模块的文件的路径名(如果模块是从文件加载的)。
但是,它可以是一个 * 相对 * 路径,因此os.path.abspath()函数用于将其转换为绝对路径,然后仅删除文件名并将模块所在目录的完整路径存储在PROJECT_ROOT中。

kiayqfof

kiayqfof2#

假设您使用django-admin startproject my_new_app命令启动项目,那么它将创建一个层次结构,如下所示。

my_new_app
|
└───my_new_app
│   │   
│   │   settings.py
│   │   ...
|   manage.py

然后,os.path.abspath(__file__)返回settings.py文件的绝对路径,os.path.dirname(os.path.abspath(__file__))返回内部my_new_app文件夹的路径,os.path.dirname(os.path.dirname(os.path.abspath(__file__)))返回外部my_new_app文件夹的路径。
在最近的Django版本中(例如,版本4.2.5),而不是os,使用pathlib模块,所以等效的构造是:

from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
PROJECT_ROOT = Path(__file__).resolve().parent

有一种特殊情况,如果settings.py已经在您的环境的根目录中(例如,本地计算机上C驱动器),使其路径看起来像C:\settings.py,则BASE_DIR == PROJECT_ROOT可能为True。这可能不应该是这样的,所以如果BASE_ROOT和PROJECT_ROOT是相同的,那么你可能需要重新构建你的项目。

相关问题