在子模块使用@hydra.main时Hydra配置加载失败问题求助
解决Hydra在子模块中使用@hydra.main的报错问题
问题原因
你遇到的Primary config module 'config' not found错误,核心原因是Hydra的config_path是相对于启动脚本(main.py)的路径,而非定义装饰器的子模块路径。你在initialise.py中写的../../config是相对于该子模块的路径,但启动脚本main.py位于src目录,这个相对路径在启动时会被解析为错误的位置,导致Hydra找不到配置目录。
另外,直接在子模块加载时调用init_configs()会跳过Hydra的命令行参数处理流程,也可能引发初始化时机的问题。
解决方案
1. 修正config_path的相对路径
将initialise.py中的config_path改为相对于启动脚本main.py的路径:../config(因为main.py在src目录,上级目录就是项目根目录,对应config文件夹)。
2. 调整初始化触发时机
不在子模块加载时自动执行初始化,而是由main.py主动触发,这样能保留Hydra的命令行参数解析、配置组合等完整功能。
修改后的代码
initialise.py
import hydra import omegaconf CONFIG = None @hydra.main(version_base=None, config_path='../config', config_name='default') def init_configs(cfg: omegaconf.DictConfig) -> None: global CONFIG CONFIG = cfg # 其他初始化代码
main.py
from utils import initialise # 触发Hydra配置初始化,支持命令行参数覆盖(比如 python main.py +configuration=configuration1) initialise.init_configs() print(initialise.CONFIG)
额外说明
- 如果启动
main.py时的工作目录是项目根目录,也可以将config_path设为config(绝对路径也可以,但相对路径更灵活)。 - 这种方式完全保留Hydra的所有核心功能:命令行参数覆盖、配置组合、多环境配置切换等,不会像
compose API那样丢失功能。
内容的提问来源于stack exchange,提问作者Raymond C.
相关产品推荐
相关产品推荐

