os.path.dirname(os.path.abspath(__file__))和os.path.dirname(__file__)之间的区别是什么?

33

我是一个正在学习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函数的链接,那将是很大的帮助。


2
你试过两个并进行比较了吗? - Jonathon Reinhart
不,它们没有指向同一个目录。 - Martijn Pieters
2个回答

45

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 数据模型

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

但是,它可以是一个相对路径,因此在删除文件名并将完整路径存储到模块所在目录的 PROJECT_ROOT 中之前,需要使用 os.path.abspath() 函数 将其转换为绝对路径。


1
假设您使用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版本),使用 pathlib 模块代替 os,因此等效的构造如下:
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相同,那么您可能需要重新组织您的项目。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接