我在Python项目中使用hydra。我的yaml配置文件包含以下几行:
now_dir: ${now:%Y-%m-%d}/${now:%H-%M-%S}
hydra:
run:
dir: ./hydra_outputs/${now_dir}
在我的代码中,我想获得hydra用于创建其输出文件夹结构的日期和时间。如果hydra有一个内置函数,可以返回包含${now:%Y-%m-%d}/${now:%H-%M-%S}
生成的日期的str
或Datetime
对象,那将是完美的。
如果没有,我仍然可以解析hydra设置的当前路径(我可以使用os.getcwd()
)或使用hydra从上面的yaml创建的Dictconfig
中的信息,但这将不太方便。
如果只使用一个普通的html锚呢?
now_dir: &nowdir ${now:%Y-%m-%d}/${now:%H-%M-%S}
您将能够在后面的.yaml文件中使用值*nowdir
。
所以我发现最好的方法是从hydra用regex创建的路径中获取日期:
>>> import re
>>> from datetime import datetime
>>> path
'hydra_outputs/2021-07-09/16-25-37/.hydra'
>>> match = re.search(r'd{4}-d{2}-d{2}/d{2}-d{2}-d{2}', path)
>>> datetime.strptime(match.group(), '%Y-%m-%d/%H-%M-%S')
datetime.datetime(2021, 7, 9, 16, 25, 37)
我把这个问题留着,以防有人有更好的解决办法。
请参阅Hydra配置文档
从Hydra 1.1版本开始,您的选项包括:
1)在你的配置中,使用hydra解析器:output_dir: ${hydra:run.dir}
注意上面yaml代码中括号内的冒号:这是对名为" hydr& quot;的自定义解析器的调用。
在您的python代码中,您可以通过主函数配置中的output_dir
键访问此值:
@hydra.main()
def my_app(cfg: DictConfig) -> None:
print(cfg.output_dir)
在你的代码中,使用HydraConfig单例:from hydra.core.hydra_config import HydraConfig
@hydra.main()
def my_app(cfg: DictConfig) -> None:
print(HydraConfig.get().run.dir)
为了得到一致的结果,确保你对HydraConfig单例的访问发生在你的@hydra.main
装饰函数的范围内。