Skip to content

Instantly share code, notes, and snippets.

@jpclipffel
Last active June 19, 2020 20:13
Show Gist options
  • Save jpclipffel/d8c2b46c7cb5e440129b2737f4fdc42f to your computer and use it in GitHub Desktop.
Save jpclipffel/d8c2b46c7cb5e440129b2737f4fdc42f to your computer and use it in GitHub Desktop.
Argparse examples

Python - argparse for Git-like CLI

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.

Usage

Tested on Python3+.
The following commands and sub-commands are implemented:

  • foo
  • bar
  • complex
    • alpha
    • beta

Code

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()
@jpclipffel
Copy link
Author

Moved to a Markdown document.
Added sub-commands parser example.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment