如何从命令行界面 (CLI) 向 OmegaConf 的结构化配置提供 List/Tuple/Collection?

How to provide a List/Tuple/Collection to OmegaConf's structured config from Command Line Interface (CLI)?

我正在使用 OmegaConfstructured 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列出路径中的文件
  • grepls 扁平化为 newline-separated 列表
  • tr: 用逗号替换换行符

以上述所需形式生成集合。