2014-08-31 2 views
11

Я добавляю подпарамеры к своему парсеру для имитации функциональных возможностей подкоманд (например, код см.: Simple command line application in python - parse user input?). Теперь я хочу добавить команду subparser/command quit, которая не принимает аргументов и имеет действие «выйти». Является ли это возможным ? Как я могу это сделать?python argparse - добавить действие в subparser без аргументов?

ответ

13

В документации для subcommands приведены два примера определения подпараметра.

https://docs.python.org/dev/library/argparse.html#sub-commands

Один, чтобы дать add_subparsersdest:

def do_quit(args): 
    # action 
    quit() 

parser = ArgumentParser() 
subparser = parser.add_subparsers(dest='cmd') 
.... 
subparser.add_parser('quit') 
... 
args = parser.parse_args() 
print args.cmd # displays 'quit' 
if args.cmd == 'quit': 
    do_quit(args) 

другой использовать set_defaults связать subparser с функцией:

parser = ArgumentParser() 
subparsers = parser.add_subparsers() 
... 
parser_quit = subparsers.add_parser('quit') 
parser_quit.set_defaults(func=do_quit) 
... 
args = parser.parse_args() 
args.func(args) 

On дальнейшая мысль, вот путь, используя обычай Action. Это как _HelpAction (который используется -h). Он вызывается позиционным аргументом с nargs=0 (или '?'). Такой аргумент всегда называется, хотя нет никаких строк для его соответствия (вернее, 0 строк соответствуют ему). Это логичное, но несколько неясное следствие того, как обрабатываются позиционные элементы.

class QuitAction(argparse.Action): 
    def __call__(self, parser, *args, **kwargs): 
     parser.exit(message="QUITTING\n") 

p=argparse.ArgumentParser() 
sp=p.add_subparsers(dest='cmd') 
p1=sp.add_parser('quit') 
p1.add_argument('foo', action=QuitAction, nargs='?', help=argparse.SUPPRESS) 
p.parse_args(['quit']) 

производства (при запуске в IPython):

QUITTING 
An exception has occurred, use %tb to see the full traceback.  
SystemExit: 0 
+0

Спасибо! Если вы посмотрите на связанный код: http://stackoverflow.com/questions/25332925/simple-command-line-application-in-python-parse-user-input/25368374#25368374, вы увидите, что я хочу разбор происходит автоматически - я не хочу добавлять логику вне парсера. Другого пути нет ? Могу ли я добавить аргумент «выйти» в основной синтаксический анализатор (без '-quit')? edit: [github] (https://github.com/Utumno/psync/blob/master/watcher/cli.py) –

+0

Sure - подкласс ArgumentParser, который переопределяет 'parse_args'. Сначала нужно было бы вызвать super(). Parse_args' (или 'parse_known_args'), а затем выполнить« логику вне парсера ». Только вы точно знаете, что скрывается за этим определением метода. – hpaulj

+0

Я добавил метод, используя необязательный пост-аргумент. – hpaulj

Смежные вопросы