Python 使用parse_known_args同时解析多个子命令

Python 使用parse_known_args同时解析多个子命令,python,python-3.x,parsing,command-line-arguments,argparse,Python,Python 3.x,Parsing,Command Line Arguments,Argparse,给出: 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(

给出:

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

如何实现这一点?

子parser的
config
获取:

['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']) []
它解析

['--configname', 'name1', '--login', 'abc1', '--password', 'def1', 'config1', '--configname', 'name2', '--login', 'abc2', '--password', 'def2']
正如所料。然后它会看到它无法处理的
config1
(无
位置
)。它将其放入
extras
列表中,并继续解析其余部分

['--configname', 'name1', '--login', 'abc1', '--password', 'def1']
这将覆盖前面的
可选值
值,这是您在
参数
中看到的结果

我认为,如果这两个次级帕斯采用不同的标志,那么这种方法就会奏效。我想在你上一个问题的链接中已经探讨过类似的问题,但我必须研究它们才能确定


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

我一直在寻找正确处理此类参数解析的方法。我将在提供的链接中进一步查看其他答案。谢谢
['--configname', 'name2', '--login', 'abc2', '--password', 'def2']