2015-04-14 3 views
0

Я хочу создать программу «установки», которые вы можете назвать так:Python argparse групп путаницы

installer install PROGRAM 
installer install PROGRAM MY_DIR 
installer list 

Я пытаюсь поручить argparse так, что вы необходим Установщик вызова либо install или list , список не требует аргументов, а для установки требуется установка программы и, при необходимости, целевой каталог. Это то, что я до сих пор:

import argparse 

parser = argparse.ArgumentParser(prog="installer") 
parser.add_argument('action', choices=['install', 'list'], help='install|list', type=str) 

subparsers = parser.add_subparsers() 

install_group = subparsers.add_parser('install', help='install program') 
install_group.add_argument('program_name', help='name of the program to install', type=str) 
install_group.add_argument('destination_dir', help='where to install the program', nargs='?', type=str) 

list_group = subparsers.add_parser('list', help="list available programs") 

args = parser.parse_args() 

Проблема заключается в том, что помощь генерироваться не кажется, чтобы отразить это:

# python installer.py --help 

usage: installer [-h] {install,list} {install,list} ... 

positional arguments: 
    {install,list} install|list 
    {install,list} 
    install  install program 
    list   list available programs 

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

помощь для python installer.py install --help это то же самое. Нет упоминания destination_dir или program_name

Любая помощь?

+0

Да, как указано в вопросе, он jusy дает тот же результат. – pistacchio

+0

Вы можете поместить 'subparsers' в группу аргументов, предоставив ему' title': parser.add_subparsers (title = 'actions', description = 'a description', help = 'a help') – hpaulj

ответ

3

Аргумент action вводит в заблуждение argparse. Удалите эту строку; вам нужны только два subparsers для того, чтобы CLI правильно себя вел (включая отказ от чего-либо, кроме install или list).

Глобальная помощь:

C:\Python34>python installer.py --help 
usage: installer [-h] {install,list} ... 

positional arguments: 
    {install,list} 
    install  install program 
    list   list available programs 

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

Установить помощь:

C:\Python34>python installer.py install --help 
usage: installer install [-h] program_name [destination_dir] 

positional arguments: 
    program_name  name of the program to install 
    destination_dir where to install the program 

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

Неподдерживаемое аргумент:

C:\Python34>python installer.py hello 
usage: installer [-h] {install,list} ... 
installer: error: invalid choice: 'hello' (choose from 'install', 'list') 

Обратите внимание, что вы мог до сих пор получили subparser помощь, передавая одно из принятых значений actionзатем именовании subparser:

C:\Python34>python installer.py install install --help 
usage: installer {install,list} install [-h] program_name [destination_dir] 

positional arguments: 
    program_name  name of the program to install 
    destination_dir where to install the program 

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