如何在 argparse 中嵌套自定义参数解析器实例

Posted

技术标签:

【中文标题】如何在 argparse 中嵌套自定义参数解析器实例【英文标题】:How to nest custom argument parser instance in argparse 【发布时间】:2021-11-14 17:21:52 【问题描述】:

我正在尝试将我创建(和测试)的多个自定义 ArgumentParser 嵌套到更大的参数解析器中。

把它想象成一个脚本有多个独立的组件,每个组件都有自己的选项。我为每个参数创建了一个 ArgumentParser,测试了它们是否与单元测试一起正常工作,并希望将一个“母亲”参数解析器拼凑在一起,它可以一次获取所有选项,但它是基于组件的。每个组件都有一些必需的选项,如果我想将它们统一到组中,这会很麻烦。

所以我现在的伪代码是这样的:

def create_custom_parser1():
    parser = ArgumentParser()
    parser.add_argument('--component1-argument1')
    ...

def create_custom_parser2():
    parser = ArgumentParser()
    parser.add_argument('--component2-argument2')
    ...

def create_unified_parser():
    unified = ArgumentParser()
    component1_parser = create_custom_parser1()
    component2_parser = create_custom_parser2()
    # somehow do this:
    # unified.add_parsers([component1_parser, component2_parser])

编辑:我的命令超长(它是一个机器学习训练管道 cli),但它有多个独立的组件(例如预处理组件、建模组件等)。我想要的是拥有一个将所有组件解析器缝合在一起的统一命令,但我想从独立的解析器开始,以保​​持我的理智并使每个解析器独立测试。

【问题讨论】:

argparse 只提供了 2 个这样的工具,parentssubcommands @hpaulj 我想通过运行 cli 顺序运行所有这些独立组件。有可能以这种方式吗?我认为子命令用于具有多个可能的命令,但在这里我有一个包含多个组件的超长命令。 【参考方案1】:

parents 机制将Actions 从父级复制到新的解析器。它旨在作为一种合并“导入”解析器的方式,而不知道其中有什么(尽管不难发现)。可能值得搜索 SO 以了解过去的经验。

子命令/解析器,将解析操作传递给新的解析器(如您所见,只有一个)。还有更多关于它的问题。它不能使用预定义的解析器(尽管我已经看到了对此类功能的错误/问题请求)。但是预定义的解析器可以用作parent

您可以独立调用所有解析器。 parse_args() 不会改变 sys.argv,因此多个解析器可以使用同一个列表。 parse_known_args 对此更好,因此解析器不会因无法识别的字符串而退出。最好也不需要(默认)optionals。通常,当用户没有意识到某些导入的模块(例如 google youtube 应用程序)也在查看命令行时,多个解析器是错误的。

或者您可以查看 sys.argv 之前,并将其拆分为您传递给不同解析器的子列表,例如parser1.parse_args(part_argv)

【讨论】:

使用 sys.argv 手动处理它是我认为不好的模式,使用 parse known_args 的父级或拥有解析器列表实际上是一件好事。

以上是关于如何在 argparse 中嵌套自定义参数解析器实例的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python argparse 解析多个嵌套的子命令?

Argparse 命令行解析模块常用参数

python ArgParse 自定义操作与使用 metavar 的键值选项导致 -h 输出中的重复

Python3中使用argparse模块解析命令行参数

Python3中使用argparse模块解析命令行参数

python 笔记:argparse