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

问题描述 投票:0回答:2

我是 Django 项目的初学者。 Django 项目的 Settings.py 文件包含以下两行:

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

我想知道区别,因为我认为两者都指向同一个目录。另外,如果您可以提供一些 os.path 函数的链接,那将会有很大的帮助。

python django os.path
2个回答
45
投票

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

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

因为

os.path.dirname()
函数 只是删除路径的最后一段。

上面的

__file__
名称指向当前模块的文件名,参见Python数据模型

__file__
是加载模块的文件的路径名(如果是从文件加载的话)。

但是,它可以是相对路径,因此

os.path.abspath()
函数用于将其转换为绝对路径,然后仅删除文件名并将模块所在目录的完整路径存储在
PROJECT_ROOT
中.


0
投票

假设您使用

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_DIR 和 PROJECT_ROOT 相同,那么您可能需要重新构建您的项目。

© www.soinside.com 2019 - 2024. All rights reserved.