snippetpythonModeratepending
Python CLI argument parsing — argparse and click patterns
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.