How to handle CLI subcommands with argparse

I need to implement a command line interface in which a program accepts subcommands.

For example, if the program is called "foo", the CLI will look like

foo cmd1 <cmd1-options>
foo cmd2
foo cmd3 <cmd3-options>

cmd1and cmd3must be used with at least one of their options, and the three arguments cmd*are always exceptional.

I am trying to use subparsers in argparse, but without success at the moment. The problem is cmd2that has no arguments:

if I try to add a subparser entry with no arguments, the namespace returned parse_argswill not contain any information telling me that this option is selected (see example below). if I try to add cmd2as an argument to parser(rather than a subparameter), then argparse expects that cmd2any of the subparameter arguments will follow the argument.

Is there an easy way to achieve this with argparse? Use case should be fairly common ...

What follows is what I tried to do so far, which is closer to what I need:

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='Functions')
parser_1 = subparsers.add_parser('cmd1', help='...')
parser_1.add_argument('cmd1_option1', type=str, help='...')

parser_2 = subparsers.add_parser(cmd2, help='...')

parser_3 = subparsers.add_parser('cmd3', help='...')
parser_3.add_argument('cmd3_options', type=int, help='...')

args = parser.parse_args()
+4
source share
2 answers

, . , , script :

$python3 test_args.py cmd1 1
Namespace(cmd1_option1='1')

test_args.py , ( import argparse print(args) ).

, cmd1 . .

, , dest add_subparsers.

set_defaults :

import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='Functions')
parser_1 = subparsers.add_parser('cmd1', help='...')
parser_1.add_argument('cmd1_option1', type=str, help='...')
parser_1.set_defaults(parser1=True)

parser_2 = subparsers.add_parser('cmd2', help='...')
parser_2.set_defaults(parser2=True)

parser_3 = subparsers.add_parser('cmd3', help='...')
parser_3.add_argument('cmd3_options', type=int, help='...')
parser_3.set_defaults(parser_3=True)

args = parser.parse_args()
print(args)

:

$python3 test_args.py cmd1 1
Namespace(cmd1_option1='1', parser1=True)
$python3 test_args.py cmd2
Namespace(parser2=True)

-. , set_defaults func. , :

subparsers = parser.add_subparsers()
parser_1 = subparsers.add_parser(...)
parser_1.set_default(func=do_command_one)

parser_k = subparsers.add_parser(...)
parser_k.set_default(func=do_command_k)

args = parser.parse_args()
if args.func:
    args.func(args)
+5

Namespace, add_subparsers dest.

:

, , dest add_subparsers() :

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(dest='subparser_name')
>>> subparser1 = subparsers.add_parser('1')
>>> subparser1.add_argument('-x')
>>> subparser2 = subparsers.add_parser('2')
>>> subparser2.add_argument('y')
>>> parser.parse_args(['2', 'frobble'])
Namespace(subparser_name='2', y='frobble')

dest - argparse.SUPPRESS, subparsers Namespace.

0

All Articles