Python - 获取根项目结构的路径
我有一个Python项目,项目的根目录下有一个配置文件。这个配置文件需要在项目中的几个不同文件里使用。
所以它的结构大概是这样的:<ROOT>/configuration.conf
,还有<ROOT>/A/a.py
和<ROOT>/A/B/b.py
(当b.py和a.py需要访问配置文件时)。
有没有什么简单的方法可以获取项目根目录和配置文件的路径,而不需要依赖于我当前在项目中的哪个文件?也就是说,不想用那种../../
的方式?可以假设我们知道项目根目录的名字。
28 个回答
要获取“根”模块的路径,你可以使用:
import os
import sys
os.path.dirname(sys.modules['__main__'].__file__)
但更有趣的是,如果你在最上层的模块中有一个配置“对象”,你可以这样从中读取:
app = sys.modules['__main__']
stuff = app.config.somefunc()
下面的代码会返回你项目根目录的路径
import sys
print(sys.path[1])
之前的所有解决方案对我来说都太复杂了,而且很多时候都不管用。我觉得你需要的其实很简单,下面这个一行的命令就能满足你的需求:
import os
ROOT_DIR = os.path.abspath(os.curdir)
其他回答建议在项目的顶层使用一个文件。但如果你使用的是 pathlib.Path
和 parent
(Python 3.4及以上版本),这其实不是必须的。想象一下下面这个目录结构,除了 README.md
和 utils.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
和相关的导入(可以使用重构工具来自动处理这个过程)。
你可以像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
。