在指定要执行哪个子命令时,是否可以在python' s(2.7)argparse
中添加不需要完全匹配的子分段?有谁知道如何做到这一点?它已经在长选项上进行前缀匹配,例如--my-long-option
可以指定为--my-l
,只要它是所有其他选项中的唯一前缀。
例如,我想要一个像这样的命令
foo apple
foo banana
foo carrot
我可以指定foo ap
使用foo apple
子分析符。
如果我使用记录的方案添加这些子分析符,则不起作用,即
sub = parser.add_subparsers(help='commands')
apple = sub.add_parser( 'apple', ... )
banana = sub.add_parser( 'banana', ... )
carrot = sub.add_parser( 'carrot', ... )
这需要指定完整的子命令名称。
答案 0 :(得分:2)
您注意到长选项适用于缩写。在最近的版本中,您可以使用allow_abbrev=False
参数将其关闭。
使用不同的机制处理子分析器名称。对于主解析器,add_subparsers(...)
创建一个位置Action,其中包含choices
参数。
您的subparsers命令大致相当于:
sp = parser.add_argument(dest='cmd', choices={'apple','banana', 'carrot'}, action=argparse._SubParsersAction, nargs='+...')
action
子类产生唯一的子析符行为。
与常规choices
一样,测试是
astring in choices
要求完全匹配,不需要任何特殊缩写。
add_parser
中的'aliases'参数可用于近似缩写。来自文档:
此外,add_parser支持额外的别名参数,该参数允许多个字符串引用相同的子分析符。这个例子,就像svn一样,别名co作为结帐的简写:
前一段时间提出了允许缩写的补丁。它是去年提交的,但后来因为它有一些错误而收回。
http://bugs.python.org/issue12713
我[hpaulj]建议关闭此问题,并依赖别名为subparsers缩写。与“选择”的互动过于复杂,无法像这里提出的那样处理。