不能有多个subparser参数

问题描述 投票:0回答:1

所以我正在尝试使用以下模式构建CLI:

cli.py api new --config config.json

要么

cli.py api del [api_name]

为了实现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')

从这里我想我们可能想要添加两个新的subparser来处理newdel子命令:

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')

但我得到了错误:cannot have multiple subparser arguments

我搜索了一下。大多数问题是关于以下模式cli.py cmdAcli.py cmdB。所以我开始认为argparse可能无法实现这种“深度”?

非常感谢。

python python-2.7 console command-line-interface argparse
1个回答
1
投票

首先,我不确定你理解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(或除此之外):

In [335]: parser = argparse.ArgumentParser(prog='my prog')
     ...: subparsers = parser.add_subparsers(dest='cmd', help='available actions')
     ...: api_parser = subparsers.add_parser('api')
     ...: 
In [336]: parser.print_help()
usage: my prog [-h] {api} ...

positional arguments:
  {api}       available actions

optional arguments:
  -h, --help  show this help message and exit
In [337]: parser.parse_args('api'.split())
Out[337]: Namespace(cmd='api')

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

但是关于多个subparser的问题 - 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_parser参数?使用subparser,帮助显示变得更加混乱。

或者您可能不需要完整的子分析器机制。例如,定义两个有选择的位置:

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}
© www.soinside.com 2019 - 2024. All rights reserved.