首页 > 解决方案 > 如何在不使用 @hydra.main() 的情况下获取 Hydra 配置

问题描述

假设我们有以下设置(从Hydra 文档复制并缩短):

配置文件:config.yaml

db:
  driver: mysql
  user: omry
  pass: secret

蟒蛇文件:my_app.py

import hydra
@hydra.main(config_path="config.yaml")
def my_app(cfg):
    print(cfg.pretty())
if __name__ == "__main__":
    my_app()

当我们可以在函数上使用装饰器时,这很有效my_app。现在我想(对于小脚本和测试目的,但这并不重要)cfg在任何函数之外获取这个对象,只是在一个普通的 python 脚本中。据我了解装饰器的工作原理,应该可以调用

import hydra
cfg = hydra.main(config_path="config.yaml")(lambda x: x)()
print(cfg.pretty())

但 thencfg只是None而不是所需的配置对象。所以看起来装饰器没有传递返回的值。还有其他方法可以做到cfg吗?

标签: python-3.xhydra-pythonfb-hydra

解决方案


使用撰写 API

from hydra import compose, initialize
from omegaconf import OmegaConf

initialize(config_path="conf", job_name="test_app")
cfg = compose(config_name="config", overrides=["db=mysql", "db.user=me"])
print(OmegaConf.to_yaml(cfg))

这只会构成配置,不会产生更改工作目录或配置 Python 日志系统等副作用。


推荐阅读