Skip to main content

Python CLI Template

Table of Contents

Use these templates if you need to build single-file Python CLIs without external packages. Replace placeholders indicated by ${TODO:...} or # TODO: ....

Simple program #

#!/usr/bin/env python3
"""${TODO: app_name} -- ${TODO: short description}
${TODO: detailed description}
${TODO: copyright notice}
"""
import argparse


def main():
    opts = get_program_options()
    # TODO: Handle program options here


def get_program_options():
    class _FC(argparse.RawDescriptionHelpFormatter,
              argparse.ArgumentDefaultsHelpFormatter):
        pass

    parser = argparse.ArgumentParser(description=__doc__, formatter_class=_FC)
    # TODO: Add command line arguments here that will be parsed during runtime.
    parser.add_argument("input", help="Required input")
    parser.add_argument("-o",
                        "--option",
                        help="Optional input",
                        default="foobarbaz")
    parser.add_argument("-f",
                        "--flag",
                        help="Toggle flag",
                        action="store_true")
    return parser.parse_args()


if __name__ == "__main__":
    main()

Subcommands #

#!/usr/bin/env python3
"""${TODO: app_name} -- ${TODO: short description}
${TODO: detailed description}
${TODO: copyright notice}
"""
import argparse


def main():
    opts = get_program_options()
    opts.func(None)


def subcommand_1_main(args):
    # TODO: Handle program options here
    pass


def subcommand_2_main(args):
    # TODO: Handle program options here
    pass


def get_program_options():
    class _FC(argparse.RawDescriptionHelpFormatter,
              argparse.ArgumentDefaultsHelpFormatter):
        pass

    parser = argparse.ArgumentParser(description=__doc__, formatter_class=_FC)
    parser.set_defaults(func=lambda args: parser.print_help())

    # TODO: Add command line arguments here that will be parsed during runtime.
    # These arguments are common to all sub-commands.
    parser.add_argument("-o",
                        "--option",
                        help="Optional input",
                        default="foobarbaz")
    parser.add_argument("-f",
                        "--flag",
                        help="Toggle flag",
                        action="store_true")

    # TODO: Add subparsers here (ie for sub-commands), or add subcommand-specific
    # arguments.
    sp = parser.add_subparsers(
        description="Run with -h or --help to view sub-command help.")

    psc1 = sp.add_parser("subcommand_1",
                         description="Subcommand 1 does something.")
    psc1.add_argument("input", help="Required input")
    psc1.set_defaults(func=subcommand_1_main)

    psc2 = sp.add_parser("subcommand_2",
                         description="Subcommand 2 does something.")
    psc2.add_argument("input", help="Required input")
    psc2.set_defaults(func=subcommand_2_main)

    return parser.parse_args()


if __name__ == "__main__":
    main()