如何从命令行界面 (CLI) 向 OmegaConf 的结构化配置提供 List/Tuple/Collection?
How to provide a List/Tuple/Collection to OmegaConf's structured config from Command Line Interface (CLI)?
我正在使用 OmegaConf
的 structured config 系统以获得一种方便的强类型方式来配置我的 Python 应用程序,因为它只需要很少的代码行并且允许合并来自源、文件系统和 CLI 的 confs。这是通过 ConfDef
class 定义的,如下所示。
现在,我想提供一个参数作为字符串的集合。虽然 OmegaConf
文档说明了 ConfDef
应该是什么样子,但没有提供有关 CLI 交互的详细信息。因此问题:
在使用结构化 OmegaConf 从 CLI 调用 Python 应用程序时,我们如何提供值的集合?
我正在使用 Ubuntu20.04,但如果存在的话,通用方法是首选。
from dataclasses import dataclass
from typing import List
from omegaconf import OmegaConf, MISSING
@dataclass
class ConfDef:
"""
:cvar MY_PATHS: Collection of paths to be processed
"""
MY_PATHS: List[str] = MISSING
在Linuxbash中,我们希望以以下形式提供集合:
python my_scripy.py MY_PATHS="[a,b,c]"
然后,在 Python 中,我们可以实例化并访问配置文件,例如如下:
conf = OmegaConf.structured(ConfDef())
cli_conf = OmegaConf.from_cli()
conf = OmegaConf.merge(conf, cli_conf)
print("\n\nCONFIGURATION:")
print(OmegaConf.to_yaml(conf), end="\n\n\n")
print(conf.MY_PATHS) # This prints the list of strings ["a", "b", "c"]
此外,如果你想用多个路径扩展一个 glob
模式,例如./data/files/*
,可以这样实现:
# just basenames
python my_script.py MY_PATHS="[`ls -p data/files/ | grep -v / | tr '\n' ','`]"
# absolute paths (nonrecursive)
python my_script.py MY_PATHS="[`EXCEL_PATHS="[`ls -d $PWD/data/files/* | tr '\n' ','`]"`]"
解释(来自here):
ls
列出路径中的文件
grep
将 ls
扁平化为 newline-separated 列表
tr
: 用逗号替换换行符
以上述所需形式生成集合。
我正在使用 OmegaConf
的 structured config 系统以获得一种方便的强类型方式来配置我的 Python 应用程序,因为它只需要很少的代码行并且允许合并来自源、文件系统和 CLI 的 confs。这是通过 ConfDef
class 定义的,如下所示。
现在,我想提供一个参数作为字符串的集合。虽然 OmegaConf
文档说明了 ConfDef
应该是什么样子,但没有提供有关 CLI 交互的详细信息。因此问题:
在使用结构化 OmegaConf 从 CLI 调用 Python 应用程序时,我们如何提供值的集合?
我正在使用 Ubuntu20.04,但如果存在的话,通用方法是首选。
from dataclasses import dataclass
from typing import List
from omegaconf import OmegaConf, MISSING
@dataclass
class ConfDef:
"""
:cvar MY_PATHS: Collection of paths to be processed
"""
MY_PATHS: List[str] = MISSING
在Linuxbash中,我们希望以以下形式提供集合:
python my_scripy.py MY_PATHS="[a,b,c]"
然后,在 Python 中,我们可以实例化并访问配置文件,例如如下:
conf = OmegaConf.structured(ConfDef())
cli_conf = OmegaConf.from_cli()
conf = OmegaConf.merge(conf, cli_conf)
print("\n\nCONFIGURATION:")
print(OmegaConf.to_yaml(conf), end="\n\n\n")
print(conf.MY_PATHS) # This prints the list of strings ["a", "b", "c"]
此外,如果你想用多个路径扩展一个 glob
模式,例如./data/files/*
,可以这样实现:
# just basenames
python my_script.py MY_PATHS="[`ls -p data/files/ | grep -v / | tr '\n' ','`]"
# absolute paths (nonrecursive)
python my_script.py MY_PATHS="[`EXCEL_PATHS="[`ls -d $PWD/data/files/* | tr '\n' ','`]"`]"
解释(来自here):
ls
列出路径中的文件grep
将ls
扁平化为 newline-separated 列表tr
: 用逗号替换换行符
以上述所需形式生成集合。