【问题标题】:Parsing multiple subcommands at once using parse_known_args使用 parse_known_args 一次解析多个子命令
【发布时间】:2018-10-23 13:11:54
【问题描述】:
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='config command help')

# create parser for config command 
parser_config = subparsers.add_parser('config', help='config help')
parser_config.add_argument('--configname', required=True, nargs=1)
parser_config.add_argument('--login', required=True, nargs=1)
parser_config.add_argument('--password', required=True, nargs=1)

parser_config1 = subparsers.add_parser('config1', help='config help')
parser_config1.add_argument('--configname', required=True, nargs=1)
parser_config1.add_argument('--login', required=True, nargs=1)
parser_config1.add_argument('--password', required=True, nargs=1)


rest = 'config --configname name1 --login abc1 --password def1 config1 --configname name2 --login abc2 --password def2'.split()

print(rest)
while rest:
        args,rest =  parser.parse_known_args(rest)
        argslist.append(args)
        print(args, rest)

给予:

$ python3 create_config.py 
['config', '--configname', 'name1', '--login', 'abc1', '--password', 'def1', 'config1', '--configname', 'name2', '--login', 'abc2', '--password', 'def2']
Namespace(configname=['name2'], login=['abc2'], password=['def2']) ['config1'] [Namespace(configname=['name2'], login=['abc2'], password=['def2'])]
usage: create_config.py config1 [-h] --configname CONFIGNAME --login LOGIN
                                --password PASSWORD
create_config.py config1: error: the following arguments are required: --configname, --login, --password

我希望看到

['config', '--configname', 'name1', '--login', 'abc1', '--password', 'def1', 'config1', '--configname', 'name2', '--login', 'abc2', '--password', 'def2']
Namespace(configname=['name1'], login=['abc1'], password=['def1']) ['config1', '--configname', 'name2', '--login', 'abc2', '--password', 'def2']
Namespace(configname=['name2'], login=['abc2'], password=['def2']) []

我怎样才能做到这一点?

【问题讨论】:

    标签: python python-3.x parsing command-line-arguments argparse


    【解决方案1】:

    config 子解析器获取:

    ['--configname', 'name1', '--login', 'abc1', '--password', 'def1', 'config1', '--configname', 'name2', '--login', 'abc2', '--password', 'def2']
    

    它解析

    ['--configname', 'name1', '--login', 'abc1', '--password', 'def1']
    

    正如预期的那样。然后它会看到config1,它无法处理(没有positionals)。它将其放入extras 列表中,并继续解析其余部分

    ['--configname', 'name2', '--login', 'abc2', '--password', 'def2']
    

    这会覆盖之前的 optional's 值,这就是您最终在 args 中看到的内容。

    我认为如果两个子解析器采用不同的标志,那么这种方法会起作用。我认为此类问题已在您之前问题的链接中进行了探讨,但我必须研究它们才能确定。

    无论如何,parse_known_args 不会在遇到无法解析的字符串时退出。像常规的parse_args 一样,它尝试处理整个列表,只是它将剩余部分作为列表返回,而不是引发错误。并且允许重复的选项,即使它们没有任何用处(除非定义为 append 操作)。

    【讨论】:

    • 我一直在寻找正确处理此类参数解析的方法。我将在提供的链接中进一步查看其他答案。谢谢
    猜你喜欢
    • 2017-01-31
    • 2019-09-23
    • 1970-01-01
    • 2014-08-20
    • 2012-05-13
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    相关资源
    最近更新 更多