0

我正在使用OmegaConf结构化配置系统,以便获得一种方便的、强类型的方式来配置我的 Python 应用程序,因为它只需要很少的代码行并且允许合并来自源、文件系统和 CLI 的配置文件。这是通过ConfDef像下面这样的类来定义的。

现在,我想提供一个参数作为字符串的集合。虽然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
4

1 回答 1

0

在 Linux bash 中,我们希望以以下形式提供集合:

python my_scripy.py MY_PATHS="[a,b,c]"

然后,在 Python 中,我们可以实例化并访问 conf,例如:

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' ','`]"`]"

说明(从这里):

  • ls列出路径中的文件
  • grep将其展平ls为换行符分隔的列表
  • tr: 用逗号替换换行符

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

于 2022-02-21T22:45:28.987 回答