假设我们有以下设置(从九头蛇博士复制和缩短):
配置文件:config.yaml
db:
driver: mysql
user: omry
pass: secretPython: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上使用一个装饰符时,这是很好的。现在,我希望(为了小脚本和测试目的,但这并不重要)在任何函数之外,仅仅在一个普通的python脚本中获得这个cfg对象。根据我对装饰师工作原理的理解,应该可以调用
import hydra
cfg = hydra.main(config_path="config.yaml")(lambda x: x)()
print(cfg.pretty())但是,cfg只是None,而不是所需的配置对象。因此,装饰器似乎不传递返回的值。还有别的方法可以到达那个cfg吗?
发布于 2020-04-12 10:04:10
使用合成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日志系统。
发布于 2021-02-23 10:40:15
上述任何一种解决方案对我都没有用。他们犯了错误:
'builtin_function_or_method‘对象没有属性'code’
和
GlobalHydra已经初始化,如果要重新初始化,请调用Globalhydra.instance().clear()。
我进一步钻研了hydra,并意识到我可以直接使用OmegaConf来加载文件。你不会被打倒,但我不担心这个。
import omegaconf
cfg = omegaconf.OmegaConf.load(path)发布于 2020-03-13 16:49:07
我找到了一个相当难看的答案,但它有效-如果有人找到一个更优雅的解决方案,请告诉我们!
我们可以使用闭包或一些可变的对象。在本例中,我们在外部定义了一个列表,并附加了config对象:
对于hydra >= 1.0.0,您必须使用config_name,请参见文档。
import hydra
c = []
hydra.main(config_name="config.yaml")(lambda x:c.append(x))()
cfg = c[0]
print(cfg)对于旧版本:
import hydra
c = []
hydra.main(config_path="config.yaml")(c.append)()
cfg = c[0]
print(cfg.pretty())https://stackoverflow.com/questions/60674012
复制相似问题