Git uses a really nice command-oriented command line interface (doesn't know a better name). Bellow a script showing
how this can be reproduced in Python using argparse
.
Tested on Python3+.
The following commands and sub-commands are implemented:
foo
bar
complex
alpha
beta
import argparse
import logging
def foo(args):
print("foo() called with the following arguments:")
print("key: {}".format(args.key))
print("value: {}".format(args.value))
print("flag: {}".format(args.flag))
print("optional: {}".format(args.optional))
def bar(args):
print("bar() called with the following arguments:")
print("mandatory: {}".format(args.mandatory))
print("values: {}".format(args.values))
print("integers: {}".format(args.integers))
def complex_alpha(args):
print("complex_alpha() called")
def complex_beta(args):
print("complex_beta() called")
def main():
# Base parser instance.
parser = argparse.ArgumentParser("python_argparse_examples")
# Log level selector (common argument).
parser.add_argument("--loglevel", type=str, choices=[v for k, v in logging._levelToName.items()], default="WARNING", help="Log level")
# Subparsers instance.
subparsers = parser.add_subparsers(dest="command")
subparsers.required = True
# ========================================================================
# The 'foo' command.
# ========================================================================
# Command's parser.
p_foo = subparsers.add_parser("foo")
# Function associated with command.
p_foo.set_defaults(func=foo)
# Positional, mandatory argument.
p_foo.add_argument("key", type=str, help="Foo's name")
# Positional, optional argument.
p_foo.add_argument("value", type=str, default=None, nargs='?', help="Foo's value")
# Flag (Switch). Defaults to `False`, becomes `True` if `--flag` is given on command line.
p_foo.add_argument("--flag", action="store_true", help="Foo's flag")
# Optional argument.
p_foo.add_argument("--optional", help="Foo's optional argument")
# ========================================================================
# The 'bar' command.
# ========================================================================
# Command's parser.
p_bar = subparsers.add_parser("bar")
# Function associated with command.
p_bar.set_defaults(func=bar)
# Mandatory argument.
p_bar.add_argument("--mandatory", required=True, help="Mandatory argument")
# Arguments list (variadic types).
p_bar.add_argument("--values", nargs='+', help="List of values")
# Integers list with default values.
p_bar.add_argument("--integers", type=int, nargs='+', default=[1, 2, 3], help="List of integers")
# ========================================================================
# The 'complex' command.
# ========================================================================
# Command's parser.
p_complex = subparsers.add_parser("complex")
# Command's subparser.
p_complex_commands = p_complex.add_subparsers(dest="command")
p_complex_commands.required = True
# ------------------------------------------------------------------------
# The 'alpha' sub-command.
# ------------------------------------------------------------------------
p_complex_alpha = p_complex_commands.add_parser("alpha")
p_complex_alpha.set_defaults(func=complex_alpha)
# ------------------------------------------------------------------------
# The 'beta' sub-command.
# ------------------------------------------------------------------------
p_complex_beta = p_complex_commands.add_parser("beta")
p_complex_beta.set_defaults(func=complex_beta)
# ========================================================================
# Execute.
# ========================================================================
# Process arguments
args = parser.parse_args()
# Run
args.func(args)
if __name__ == "__main__":
main()
Moved to a Markdown document.
Added sub-commands parser example.