2015-08-14 56 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

相關問題