首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不使用@hydra.main()的情况下获得Hydra配置

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

Stack Overflow用户
提问于 2020-03-13 16:26:20
回答 5查看 18K关注 0票数 31

假设我们有以下设置(从九头蛇博士复制和缩短):

配置文件:config.yaml

代码语言:javascript
复制
db:
  driver: mysql
  user: omry
  pass: secret

Python:my_app.py

代码语言:javascript
复制
import hydra
@hydra.main(config_path="config.yaml")
def my_app(cfg):
    print(cfg.pretty())
if __name__ == "__main__":
    my_app()

当我们可以在函数my_app上使用一个装饰符时,这是很好的。现在,我希望(为了小脚本和测试目的,但这并不重要)在任何函数之外,仅仅在一个普通的python脚本中获得这个cfg对象。根据我对装饰师工作原理的理解,应该可以调用

代码语言:javascript
复制
import hydra
cfg = hydra.main(config_path="config.yaml")(lambda x: x)()
print(cfg.pretty())

但是,cfg只是None,而不是所需的配置对象。因此,装饰器似乎不传递返回的值。还有别的方法可以到达那个cfg吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-04-12 10:04:10

使用合成API

代码语言:javascript
复制
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日志系统。

票数 41
EN

Stack Overflow用户

发布于 2021-02-23 10:40:15

上述任何一种解决方案对我都没有用。他们犯了错误:

'builtin_function_or_method‘对象没有属性'code

GlobalHydra已经初始化,如果要重新初始化,请调用Globalhydra.instance().clear()。

我进一步钻研了hydra,并意识到我可以直接使用OmegaConf来加载文件。你不会被打倒,但我不担心这个。

代码语言:javascript
复制
import omegaconf
cfg = omegaconf.OmegaConf.load(path)
票数 5
EN

Stack Overflow用户

发布于 2020-03-13 16:49:07

我找到了一个相当难看的答案,但它有效-如果有人找到一个更优雅的解决方案,请告诉我们!

我们可以使用闭包或一些可变的对象。在本例中,我们在外部定义了一个列表,并附加了config对象:

对于hydra >= 1.0.0,您必须使用config_name,请参见文档

代码语言:javascript
复制
import hydra
c = []
hydra.main(config_name="config.yaml")(lambda x:c.append(x))()
cfg = c[0]
print(cfg)

对于旧版本:

代码语言:javascript
复制
import hydra
c = []
hydra.main(config_path="config.yaml")(c.append)()
cfg = c[0]
print(cfg.pretty())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60674012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档