This is the solution I came up with:
import argparse
# See https://stackoverflow.com/a/8632404/2451238 + argparse._HelpAction source
def short_help(help_message):
class shortHelpAction(argparse.Action):
def __init__(self,
option_strings,
dest = argparse.SUPPRESS,
default = argparse.SUPPRESS,
help = None,
deprecated = False):
super(shortHelpAction, self).__init__(
option_strings = option_strings,
dest = dest,
default = default,
nargs = 0,
help = help,
deprecated = deprecated)
def __call__(self, parser, namespace, args, option_string = None):
print(help_message)
parser.exit()
return shortHelpAction
ap = argparse.ArgumentParser(add_help = False, conflict_handler = "resolve")
ap.add_argument("-h", "--help", action = short_help(None),
help = "show help message (common parameters only) and exit")
ap.add_argument("-H", "--help-all", action = "help",
help = """show extended help message (incl. advanced
parameters) and exit""")
ap.add_argument("-v", "--version", action = "version", version = "1.0")
common_args = ap.add_argument_group("common parameters",
"""These parameters are typically
enough to run the tool. `%(prog)s
-h|--help` should list these
parameters.""")
common_args.add_argument("-f", "--foo", metavar = "<foo>",
help = "the very common Foo parameter")
common_args.add_argument("--flag", action = "store_true",
help = "a flag enabling a totally normal option")
ap.add_argument("-h", "--help", action = short_help(ap.format_help()))
advanced_args = ap.add_argument_group("advanced parameters",
"""These parameters are for advanced
users with special needs only. To make
the help more accessible, `%(prog)s
-h|--help` should not include these
parameters, while `%(prog)s
-H|--help-all` should include them (in
addition to those included by `%(prog)s
-h|--help`.""")
advanced_args.add_argument("-b", "--bar", metavar = "<bar>",
help = "the rarely needed Bar parameter")
advanced_args.add_argument("-B", "--baz", metavar = "<bar>",
help = "the even more obscure Baz parameter")
advanced_args.add_argument("--FLAG", action = "store_true",
help = "a flag for highly advanced users only")
ap.parse_args()
python extended_help.py -h
prints
usage: extended_help.py [-h] [-H] [-v] [-f <foo>] [--flag]
options:
-h, --help show help message (common parameters only) and exit
-H, --help-all show extended help message (incl. advanced parameters) and exit
-v, --version show program's version number and exit
common parameters:
These parameters are typically enough to run the tool. `extended_help.py -h|--help` should list these parameters.
-f, --foo <foo> the very common Foo parameter
--flag a flag enabling a totally normal option
,
python extended_help.py -v
1.0
, and
python extended_help.py -H
usage: extended_help.py [-H] [-v] [-f <foo>] [--flag] [-h] [-b <bar>] [-B <bar>] [--FLAG]
options:
-H, --help-all show extended help message (incl. advanced parameters) and exit
-v, --version show program's version number and exit
-h, --help
common parameters:
These parameters are typically enough to run the tool. `extended_help.py -h|--help` should list these parameters.
-f, --foo <foo> the very common Foo parameter
--flag a flag enabling a totally normal option
advanced parameters:
These parameters are for advanced users with special needs only. To make the help more accessible, `extended_help.py -h|--help` should not include these parameters, while
`extended_help.py -H|--help-all` should include them (in addition to those included by `extended_help.py -h|--help`.
-b, --bar <bar> the rarely needed Bar parameter
-B, --baz <bar> the even more obscure Baz parameter
--FLAG a flag for highly advanced users only
.