所以我正在尝试使用以下模式构建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')
从这里我想我们可能想要添加两个新的子分析器来处理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')
但是我收到了错误:cannot have multiple subparser arguments
我搜索了一下。大多数问题都是关于以下pattenr cli.py cmdA
和cli.py cmdB
。所以我开始认为argparse可能无法实现这种“深度”?
非常感谢。
答案 0 :(得分: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命令。
但是关于多个子分析师的问题 - 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
的简单参数?使用subparsers时,帮助显示会变得更加混乱。
或者您可能不需要完整的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}