Python 不能有多个子参数

Python 不能有多个子参数,python,python-2.7,console,command-line-interface,argparse,Python,Python 2.7,Console,Command Line Interface,Argparse,因此,我尝试使用以下模式构建CLI: cli.py api new --config config.json 或 为了实现api,我添加了它作为sup解析器 if __name__ == '__main__': parser = argparse.ArgumentParser(prog='my prog') subparsers = parser.add_subparsers(title='api', help='available actions') api_pa

因此,我尝试使用以下模式构建CLI:

cli.py api new --config config.json

为了实现
api
,我添加了它作为sup解析器

if __name__ == '__main__':

    parser = argparse.ArgumentParser(prog='my prog')
    subparsers = parser.add_subparsers(title='api', help='available actions')

    api_parser = subparsers.add_parser('api')
从这里我想我们可能需要添加两个新的子parser来处理
new
del
子命令:

if __name__ == '__main__':

    parser = argparse.ArgumentParser(prog='my prog')
    subparsers = parser.add_subparsers(title='api', help='available actions')

    api_parser = subparsers.add_parser('api')

    api_new_subparsers = api_parser.add_subparsers(title='new', help='%(prog)s creates new api gateway')
    api_del_subparsers = api_parser.add_subparsers(title='del', help='%(prog)s deletes an api gateway')
但是我得到了一个错误:
不能有多个子parser参数

我找了一点。大多数问题都是关于以下模式的
cli.py cmdA
cli.py cmdB
。所以我开始想argparse可能无法达到这样的“深度”


非常感谢。

首先,我不确定您是否理解
title
参数的用途

In [332]: parser = argparse.ArgumentParser(prog='my_prog')
     ...: subparsers = parser.add_subparsers(title='api', help='available actions')
     ...: api_parser = subparsers.add_parser('api')
     ...: 
In [333]: parser.print_help()
usage: my_prog [-h] {api} ...

optional arguments:
  -h, --help  show this help message and exit

api:
  {api}       available actions
In [334]: parser.parse_args('api'.split())
Out[334]: Namespace()
title
只需在帮助中定义一个组。它不会改变解析。定义
dest
而不是
title
(或除此之外):

这将标识
args
命名空间中的subparser命令

但是关于多个子parser的问题-
argparse
不允许您定义它。你可以把它们放在窝里。那是你可以用的

sp2 = api_parser.add_subparsers(dest='foo')
sp2.add_parser('del')
sp2.add_parser('inc')

In [339]: parser.parse_args('api del'.split())
Out[339]: Namespace(cmd='api', foo='del')
In [340]: parser.parse_args('api inc'.split())
Out[340]: Namespace(cmd='api', foo='inc')
In [341]: parser.parse_args('api -h'.split())
usage: my_prog api [-h] {del,inc} ...

positional arguments:
  {del,inc}
但是在这方面走得太远之前,您是否尝试过在
api\u解析器中添加纯参数?帮助显示会变得混乱,你越是使用次parser

或者可能你不需要完整的次帕瑟机制。例如,使用选项定义两个位置:

In [345]: parser = argparse.ArgumentParser(prog='my_prog')
     ...: parser.add_argument('cmd1', choices=['api'], help='available actions')
     ...: ;
     ...: parser.add_argument('cmd2', choices=['del','inc']);
     ...: 
In [347]: parser.parse_args('api inc'.split())
Out[347]: Namespace(cmd1='api', cmd2='inc')
In [348]: parser.parse_args('-h'.split())
usage: my_prog [-h] {api} {del,inc}

positional arguments:
  {api}       available actions
  {del,inc}
sp2 = api_parser.add_subparsers(dest='foo')
sp2.add_parser('del')
sp2.add_parser('inc')

In [339]: parser.parse_args('api del'.split())
Out[339]: Namespace(cmd='api', foo='del')
In [340]: parser.parse_args('api inc'.split())
Out[340]: Namespace(cmd='api', foo='inc')
In [341]: parser.parse_args('api -h'.split())
usage: my_prog api [-h] {del,inc} ...

positional arguments:
  {del,inc}
In [345]: parser = argparse.ArgumentParser(prog='my_prog')
     ...: parser.add_argument('cmd1', choices=['api'], help='available actions')
     ...: ;
     ...: parser.add_argument('cmd2', choices=['del','inc']);
     ...: 
In [347]: parser.parse_args('api inc'.split())
Out[347]: Namespace(cmd1='api', cmd2='inc')
In [348]: parser.parse_args('-h'.split())
usage: my_prog [-h] {api} {del,inc}

positional arguments:
  {api}       available actions
  {del,inc}