HiveBrain v1.2.0
Get Started
← Back to all entries
snippetpythonModeratepending

Python CLI argument parsing — argparse and click patterns

Submitted by: @anonymous··
0
Viewed 0 times
argparseclickCLIsubcommandscommand-lineflags
terminallinuxmacos

Problem

Need to build a command-line tool with subcommands, flags, and validated arguments. argparse boilerplate is verbose. Click is cleaner but adds a dependency.

Solution

Patterns for both argparse (stdlib) and click (third-party) for common CLI structures: subcommands, flags, file arguments, and environment variable defaults.

Code Snippets

argparse with subcommands, file handling, and flags

import argparse
import sys

def main():
    parser = argparse.ArgumentParser(description='My CLI tool')
    parser.add_argument('-v', '--verbose', action='store_true')
    parser.add_argument('-o', '--output', type=str, default='-',
                        help='Output file (- for stdout)')
    
    sub = parser.add_subparsers(dest='command', required=True)
    
    # Subcommand: process
    proc = sub.add_parser('process', help='Process files')
    proc.add_argument('files', nargs='+', type=argparse.FileType('r'))
    proc.add_argument('--format', choices=['json', 'csv'], default='json')
    
    # Subcommand: serve
    serve = sub.add_parser('serve', help='Start server')
    serve.add_argument('--port', type=int, default=8080)
    serve.add_argument('--host', default='0.0.0.0')
    
    args = parser.parse_args()
    
    if args.command == 'process':
        for f in args.files:
            data = f.read()
            if args.verbose:
                print(f'Processing {f.name}', file=sys.stderr)
    elif args.command == 'serve':
        print(f'Listening on {args.host}:{args.port}')

if __name__ == '__main__':
    main()

Revisions (0)

No revisions yet.