Python跨目录导入自定义模块时相对路径配置文件无法读取问题
问题根因
代码里用./folder2/conf.ini这类相对路径读取文件时,Python的路径解析基准是进程当前的工作目录(CWD),和sys.path里配置的模块搜索路径、代码文件自身的存放位置没有关系。
- 当Notebook和模块存放在同一目录时,Jupyter默认的工作目录就是模块根目录,相对路径刚好能匹配到配置文件位置,所以整套逻辑运行正常
- 当Notebook存放在其他独立目录时,工作目录切到了Notebook所在的独立路径,哪怕你提前执行
sys.path.append(path_to_dir)把模块根目录加进了模块搜索路径,读取文件时依然会从当前工作目录下查找folder2/conf.ini,自然找不到目标文件,最终触发配置读取失败的KeyError
修复方法
所有模块内部依赖的静态资源(配置文件、内置数据集等),都不要写死相对路径,要基于当前代码文件的存放位置动态拼接绝对路径,完全脱离运行时工作目录的影响。
基于os模块实现(兼容所有Python版本)
修改tech.py里读取配置文件的路径逻辑:
import os # 获取tech.py自身的绝对路径 current_file_abspath = os.path.abspath(__file__) # 定位到tech.py所属的folder1目录 folder1_dir = os.path.dirname(current_file_abspath) # 定位到模块根目录dir module_root_dir = os.path.dirname(folder1_dir) # 拼接得到conf.ini的完整绝对路径 conf_abs_path = os.path.join(module_root_dir, "folder2", "conf.ini")
后续读取配置文件时,直接传入conf_abs_path作为路径参数即可。
基于pathlib实现(Python 3.4+推荐写法)
写法更简洁,可读性更强:
from pathlib import Path # 获取tech.py的绝对路径对象 current_file = Path(__file__).resolve() # 向上两级定位到模块根目录(tech.py -> folder1 -> 模块根目录) module_root = current_file.parent.parent conf_abs_path = module_root / "folder2" / "conf.ini"
注意:
sys.path仅控制Pythonimport语句的模块搜索范围,对普通文件读写的路径解析没有任何影响,二者是完全独立的两套路径逻辑,不要混淆。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

