如何在不使用 @hydra.main() 的情况下获取 Hydra 配置

新手上路,请多包涵

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

配置文件: config.yaml

 db:
  driver: mysql
  user: omry
  pass: secret

Python 文件: 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())

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

原文由 flawr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

使用 撰写 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 日志系统这样的副作用。

原文由 Omry Yadan 发布,翻译遵循 CC BY-SA 4.0 许可协议

以上解决方案都不适合我。他们给出了错误:

“builtin_function_or_method”对象没有属性“ 代码

GlobalHydra 已经初始化,调用 Globalhydra.instance().clear() 如果你想重新初始化

我进一步研究了 hydra 并意识到我可以使用 OmegaConf 直接加载文件。你不会得到覆盖,但我对此并不大惊小怪。

 import omegaconf
cfg = omegaconf.OmegaConf.load(path)

原文由 forgetso 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进