pythonbeginner

Python CLI Tool with Argparse

Build a command-line tool with subcommands, arguments, validation, and help text using argparse.

python
import argparse
import sys


def cmd_init(args: argparse.Namespace) -> None:
    print(f"Initializing project '{args.name}' with template '{args.template}'")


def cmd_build(args: argparse.Namespace) -> None:
    mode = "production" if args.production else "development"
    print(f"Building in {mode} mode, output: {args.output}")
    if args.verbose:
        print("Verbose logging enabled")


def cmd_deploy(args: argparse.Namespace) -> None:
    print(f"Deploying to {args.target} environment")
    if args.dry_run:
        print("DRY RUN — no changes will be made")


def main() -> int:
    parser = argparse.ArgumentParser(
        prog="mytool",
        description="Project management CLI tool",
    )
    parser.add_argument("-v", "--verbose", action="store_true", help="Enable verbose output")
    parser.add_argument("--version", action="version", version="%(prog)s 1.0.0")

    subparsers = parser.add_subparsers(dest="command", required=True)

    # init subcommand
    init_parser = subparsers.add_parser("init", help="Initialize a new project")
    init_parser.add_argument("name", help="Project name")
    init_parser.add_argument("-t", "--template", default="default", choices=["default", "api", "web"])
    init_parser.set_defaults(func=cmd_init)

    # build subcommand
    build_parser = subparsers.add_parser("build", help="Build the project")
    build_parser.add_argument("-o", "--output", default="dist", help="Output directory")
    build_parser.add_argument("-p", "--production", action="store_true")
    build_parser.set_defaults(func=cmd_build)

    # deploy subcommand
    deploy_parser = subparsers.add_parser("deploy", help="Deploy the project")
    deploy_parser.add_argument("target", choices=["staging", "production"])
    deploy_parser.add_argument("--dry-run", action="store_true")
    deploy_parser.set_defaults(func=cmd_deploy)

    args = parser.parse_args()
    args.func(args)
    return 0


if __name__ == "__main__":
    sys.exit(main())

Use Cases

  • Building developer tooling CLIs
  • Project scaffolding and automation scripts
  • Deployment and build management tools

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.