argparse & configparser
argparse builds CLI interfaces with --flags, subcommands, and help text. configparser reads INI-style files for layered defaults - pair with environment variables for twelve-factor apps.
Search across all documentation pages
argparse builds CLI interfaces with --flags, subcommands, and help text. configparser reads INI-style files for layered defaults - pair with environment variables for twelve-factor apps.
import argparse
parser = argparse.ArgumentParser(description="Demo CLI")
parser.add_argument("--verbose", action="store_true")
parser.add_argument("name")
args = parser.parse_args(["Ada", "--verbose"])When to reach for this:
setup.cfg, logging.ini)git-style)import argparse
import configparser
from pathlib import Path
def build_parser() -> argparse.ArgumentParser:
p = argparse.ArgumentParser()
p.add_argument("--config", type=Path, default=Path("app.ini"))
p.add_argument("--port", type=int)
return p
def load_config(path: Path) -> configparser.ConfigParser:
cfg = configparser.ConfigParser()
if path.exists():
cfg.read(path, encoding="utf-8")
return cfg
def resolve_port(args: argparse.Namespace, cfg: configparser.ConfigParser) -> int:
if args.port is not None:
return args.port
if cfg.has_option("server", "port"):
return cfg.getint("server", "port")
return 8000
args = build_parser().parse_args(["--port", "9000"])
cfg = load_config(args.config)
print(resolve_port(args, cfg))What this demonstrates:
getint)nargs, choices, metavaradd_subparsers for subcommandsArgumentDefaultsHelpFormatter shows defaults%(section)s optionalConfigParser does not support full TOML - use tomllib for pyprojecttype=bool broken. Fix: action="store_true".main().| Alternative | Use When | Don't Use When |
|---|---|---|
| typer/click | Rich CLI UX | Zero-dep script |
| tomllib | pyproject TOML | INI legacy only |
| pydantic-settings | Validated env config | Tiny script |
typer nicer DX; argparse stdlib zero dependency.
os.environ.get after argparse - document precedence order.
subparsers = parser.add_subparsers(dest="command", required=True).
cfg.write(open(path,"w")) - preserve user comments not guaranteed on roundtrip edits.
argparse generates help - fill description and epilog.
One or more positional tokens collected to list.
New config prefer tomllib/pyproject; configparser for legacy INI only.
Invoke main(argv) with explicit list - do not rely on sys.argv mutation globally.
argcomplete PyPI optional; typer has built-in shell completion paths.
Django wraps argparse-like API - separate from standalone scripts.
Stack versions: This page was written for Python 3.14.0 (stable 3.14, maintenance 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, and uv 0.6+.
Reviewed by Chris St. John·Last updated Jul 19, 2026