Python-获取根项目structu的路径

2024-05-05 00:50:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python项目,在项目根目录中有一个配置文件。 在整个项目中,需要在几个不同的文件中访问配置文件。

所以它看起来像:<ROOT>/configuration.conf<ROOT>/A/a.py<ROOT>/A/B/b.py(当b,a.py访问配置文件时)。

在不依赖于项目中的哪个文件的情况下,获得项目根目录和配置文件的路径的最佳/最简单的方法是什么?i、 不使用../../?假设我们知道项目根的名称是可以的。


Tags: 文件项目方法py路径名称conf配置文件
3条回答

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

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

但更有趣的是,如果您在最上面的模块中有一个配置“对象”,那么您可以这样读取它:

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

其他回答建议在项目的顶层使用文件。如果使用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:
    """Returns project root folder."""
    return Path(__file__).parent.parent

在项目的任何模块中,我们现在都可以获得项目根目录,如下所示。

from src.utils import get_project_root

root = get_project_root()

优点:任何调用get_project_root的模块都可以在不改变程序行为的情况下移动。只有当模块utils.py被移动时,我们才需要更新get_project_root和导入(重构工具可用于自动化此操作)。

你可以像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`

然后,您可以使用import语句(例如在utils.py):from definitions import CONFIG_PATH中轻松地访问常量(在任何其他文件中)。

相关问题 更多 >