2024-05-05 00:50:44 发布
网友
我有一个python项目,在项目根目录中有一个配置文件。 在整个项目中,需要在几个不同的文件中访问配置文件。
所以它看起来像:<ROOT>/configuration.conf<ROOT>/A/a.py,<ROOT>/A/B/b.py(当b,a.py访问配置文件时)。
<ROOT>/configuration.conf
<ROOT>/A/a.py
<ROOT>/A/B/b.py
在不依赖于项目中的哪个文件的情况下,获得项目根目录和配置文件的路径的最佳/最简单的方法是什么?i、 不使用../../?假设我们知道项目根的名称是可以的。
../../
要获取“根”模块的路径,可以使用:
import os import sys os.path.dirname(sys.modules['__main__'].__file__)
但更有趣的是,如果您在最上面的模块中有一个配置“对象”,那么您可以这样读取它:
app = sys.modules['__main__'] stuff = app.config.somefunc()
其他回答建议在项目的顶层使用文件。如果使用pathlib.Path和parent(Python 3.4及更高版本),则无需执行此操作。考虑下面的目录结构,其中省略了除README.md和utils.py之外的所有文件。
pathlib.Path
parent
README.md
utils.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和导入(重构工具可用于自动化此操作)。
get_project_root
你可以像Django那样做到这一点:从项目顶层的文件中为项目根定义一个变量。例如,如果您的项目结构是这样的:
project/ configuration.conf definitions.py main.py utils.py
在definitions.py中,您可以定义(这需要import os):
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中轻松地访问常量(在任何其他文件中)。
from definitions import CONFIG_PATH
要获取“根”模块的路径,可以使用:
但更有趣的是,如果您在最上面的模块中有一个配置“对象”,那么您可以这样读取它:
其他回答建议在项目的顶层使用文件。如果使用
pathlib.Path
和parent
(Python 3.4及更高版本),则无需执行此操作。考虑下面的目录结构,其中省略了除README.md
和utils.py
之外的所有文件。在
utils.py
中,我们定义了以下函数。在项目的任何模块中,我们现在都可以获得项目根目录,如下所示。
优点:任何调用
get_project_root
的模块都可以在不改变程序行为的情况下移动。只有当模块utils.py
被移动时,我们才需要更新get_project_root
和导入(重构工具可用于自动化此操作)。你可以像Django那样做到这一点:从项目顶层的文件中为项目根定义一个变量。例如,如果您的项目结构是这样的:
在
definitions.py
中,您可以定义(这需要import os
):因此,在已知项目根目录的情况下,可以创建指向配置位置的变量(可以在任何地方定义,但逻辑位置是将其放在定义常量的位置,例如
definitions.py
):然后,您可以使用import语句(例如在
utils.py
):from definitions import CONFIG_PATH
中轻松地访问常量(在任何其他文件中)。相关问题 更多 >
编程相关推荐