2015-08-14 93 views
2

我有一个具有多个命令的脚本,每个命令都通过使用add_subparser将它自己设置为必需和/或可选参数。分组argparse子分析器参数

=->test.py -h 
usage: test.py [-h] <command> ... 

positional arguments: 
    <command> Available Commands 
    cmd1  Command 1 
    cmd2  Command 2 
    cmd3  Command 3 
    cmd4  Command 4 

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


=->test.py cmd1 -h 
usage: test.py cmd1 [-h] --flag1 FLAG1 

optional arguments: 
    -h, --help  show this help message and exit 
    --flag1 FLAG1 Test flag 


=->test.py cmd2 -h 
usage: test.py cmd2 [-h] [--flag2 FLAG2] 

optional arguments: 
    -h, --help  show this help message and exit 
    --flag2 FLAG2 Test flag 

我想这些命令不知何故分成小组,让用户看到类似以下内容:

=->test.py -h 
usage: test.py [-h] <command> ... 

First Group: 
    cmd1  Command 1 
    cmd2  Command 2 

Second Group: 
    cmd3  Command 3 
    cmd4  Command 4 

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

但是,并不像add_argument_group和add_subparsers一起工作。

任何方式来实现这一目标?

回答

5

你是对的,论证组和子分析者不能一起工作。这是因为subparsers(或者他们的名字)不是争论。

sp = parser.add_subparsers(...)命令创建一个参数,或者从技术上讲是argparse.Action的子类的一个实例。这是一个立场的论点。 add_parser命令创建一个对象(即调用argparse.ArgumentParser),并将其与其名称(和别名)一起添加到此操作拥有的字典中。这些名称将填充Action的choices属性。

subparserssubparsers该操作可能属于参数组,但由于只能有一个此类操作,因此无法帮助您对帮助行进行分组。

可以控制在一定程度上,通过使用说明,并省略对subparsers

import argparse 

description = """ 
First Group: 
    cmd1  Command 1 
    cmd2  Command 2 

Second Group: 
    cmd3  Command 3 
    cmd4  Command 4""" 

parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter) 
sp = parser.add_subparsers(title='commands',description=description) 
sp.add_parser('cmd1') 
sp.add_parser('cmd2') 
sp.add_parser('cmd3') 
sp.add_parser('cmd4') 

parser.print_help() 

帮助帮助产生

1343:~/mypy$ python stack32017020.py 
usage: stack32017020.py [-h] {cmd1,cmd2,cmd3,cmd4} ... 

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

commands: 

    First Group: 
    cmd1  Command 1 
    cmd2  Command 2 

    Second Group: 
    cmd3  Command 3 
    cmd4  Command 4 

    {cmd1,cmd2,cmd3,cmd4} 

http://bugs.python.org/issue9341 - 允许argparse子命令是分组

谈到做你想做的事情。我提出的补丁不是微不足道的。但欢迎您来测试它。

+0

我在Python 3.6中,这_almost_的作品。在{cmd1,cmd2,cmd3,cmd4}行之后仍然有原始帮助输出的其余部分结束您的示例输出。任何想法如何抑制? – Nathan