如何在Python中从子目录脚本获取主项目目录路径以访问配置文件?
解决Python脚本跨目录访问配置文件的问题
绝对路径在不同部署环境里确实特别麻烦,我之前做项目也踩过这个坑,给你两个实用的方案:
方法1:使用os模块(兼容所有Python版本)
核心思路就是通过__file__拿到当前脚本的路径,然后多次调用os.path.dirname()往上回溯到项目根目录。注意一定要用os.path.abspath()把相对路径转成绝对路径,避免环境差异导致的问题。
import os # 1. 获取当前脚本的绝对路径 current_script = os.path.abspath(__file__) # 2. 回溯到source目录(当前脚本的父目录) source_dir = os.path.dirname(current_script) # 3. 再回溯一级就是PythonProject主目录 project_root = os.path.dirname(source_dir) # 4. 拼接配置文件路径 config_path = os.path.join(project_root, "configs", "config.json") # 也可以简化成一行代码 config_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "configs", "config.json")
方法2:使用pathlib(Python3.4+ 推荐,更简洁)
pathlib是Python3.4引入的面向对象路径操作模块,语法更直观,代码可读性更高,还能自动适配不同系统的路径分隔符:
from pathlib import Path # 1. 获取当前脚本的绝对路径对象(resolve()确保是绝对路径) current_script = Path(__file__).resolve() # 2. 连续两次调用parent,从script.py -> source -> PythonProject project_root = current_script.parent.parent # 3. 用/直接拼接路径,和系统无关 config_path = project_root / "configs" / "config.json" # 如果需要字符串格式的路径,直接转成str即可 config_path_str = str(config_path)
小提示
如果以后你的目录结构可能调整(比如source目录下新增子文件夹),可以考虑更灵活的方式:从当前目录向上遍历,直到找到configs目录或者项目的标识文件(比如requirements.txt、pyproject.toml),不过对于固定目录结构的项目,上面两种方法完全够用。
内容的提问来源于stack exchange,提问作者S Andrew




