Python - 获取根项目结构的路径

307 投票
28 回答
536877 浏览
提问于 2025-04-18 17:49

我有一个Python项目,项目的根目录下有一个配置文件。这个配置文件需要在项目中的几个不同文件里使用。

所以它的结构大概是这样的:<ROOT>/configuration.conf,还有<ROOT>/A/a.py<ROOT>/A/B/b.py(当b.py和a.py需要访问配置文件时)。

有没有什么简单的方法可以获取项目根目录和配置文件的路径,而不需要依赖于我当前在项目中的哪个文件?也就是说,不想用那种../../的方式?可以假设我们知道项目根目录的名字。

28 个回答

30

要获取“根”模块的路径,你可以使用:

import os
import sys
os.path.dirname(sys.modules['__main__'].__file__)

但更有趣的是,如果你在最上层的模块中有一个配置“对象”,你可以这样从中读取:

app = sys.modules['__main__']
stuff = app.config.somefunc()
53

下面的代码会返回你项目根目录的路径

import sys
print(sys.path[1])
62

之前的所有解决方案对我来说都太复杂了,而且很多时候都不管用。我觉得你需要的其实很简单,下面这个一行的命令就能满足你的需求:

import os
ROOT_DIR = os.path.abspath(os.curdir)
195

其他回答建议在项目的顶层使用一个文件。但如果你使用的是 pathlib.Pathparent(Python 3.4及以上版本),这其实不是必须的。想象一下下面这个目录结构,除了 README.mdutils.py,其他文件都省略了。

project
│   README.md
|
└───src
│   │   utils.py
|   |   ...
|   ...

utils.py 文件中,我们定义了一个函数。

from pathlib import Path

def get_project_root() -> Path:
    return Path(__file__).parent.parent

在项目中的任何模块里,我们现在都可以这样获取项目的根目录。

from src.utils import get_project_root

root = get_project_root()

好处:任何调用 get_project_root 的模块都可以移动,而不会影响程序的运行。只有当 utils.py 被移动时,我们才需要更新 get_project_root 和相关的导入(可以使用重构工具来自动处理这个过程)。

313

你可以像Django那样做:从项目的顶层文件中定义一个指向项目根目录的变量。 比如,如果你的项目结构是这样的:

project/
    configuration.conf
    definitions.py
    main.py
    utils.py

definitions.py 文件中,你可以定义这个变量(这需要先 import os):

ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) # This is your Project Root

这样一来,既然知道了项目根目录,你就可以创建一个指向配置文件位置的变量(这个变量可以在任何地方定义,但放在常量定义的地方比较合适,比如 definitions.py):

CONFIG_PATH = os.path.join(ROOT_DIR, 'configuration.conf')  # requires `import os`

然后,你可以在其他文件中轻松访问这个常量,只需使用导入语句(比如在 utils.py 中): from definitions import CONFIG_PATH

撰写回答