argparse y configparser
argparse crea interfaces CLI con --flags, subcomandos y texto de ayuda. configparser lee archivos estilo INI para valores predeterminados en capas; combínalo con variables de entorno para aplicaciones de doce factores.
Receta
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"])Cuándo recurrir a esto:
- Herramientas CLI internas y scripts de desarrollo
- Configuración INI heredada (
setup.cfg, logging.ini) - Typer/click aún no justificados
- Herramientas basadas en subcomandos (estilo
git) - Patrón de archivo de configuración predeterminado + anulación de CLI
Ejemplo de trabajo
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))Lo que esto demuestra:
- Las anulaciones de la CLI superan la configuración del archivo, que supera los valores predeterminados
- Secciones de
configparsery obtentores tipados (getint) - Tipo
Pathpara rutas deargparse - Codificación explícita en la lectura para portabilidad
Inmersión profunda
Características de argparse
nargs,choices,metavaradd_subparserspara subcomandosArgumentDefaultsHelpFormattermuestra los valores predeterminados
Notas de configparser
- Interpolación
%(section)sopcional ConfigParserno admite TOML completo; usatomllibparapyproject
Trampas comunes
- Flags booleanos incorrectos -
type=boolestá roto. Solución:action="store_true". - Confusión entre opcional y requerido - documenta claramente los argumentos posicionales vs. opcionales.
- Configuración faltante silenciosamente - los valores predeterminados vacíos sorprenden. Solución: valida las secciones requeridas después de la lectura.
- Secretos en INI - archivos legibles por cualquiera. Solución: usa variables de entorno para secretos, no configures archivos que se suban al repositorio.
argparseen la importación de la biblioteca -parse_argscomo efecto secundario en la importación. Solución: protégelo dentro demain().
Alternativas
| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| typer/click | Experiencia de usuario CLI enriquecida | Script sin dependencias |
| tomllib | pyproject TOML | Solo INI heredado |
| pydantic-settings | Configuración de entorno validada | Script pequeño |
Preguntas frecuentes
¿typer vs argparse?
typer ofrece una mejor experiencia de desarrollo (DX); argparse es parte de la biblioteca estándar, sin dependencias.
¿Patrón de anulación de entorno?
os.environ.get después de argparse - documenta el orden de precedencia.
¿Subcomandos?
subparsers = parser.add_subparsers(dest="command", required=True).
¿Escribir con `configparser`?
cfg.write(open(path,"w")) - no se garantiza la preservación de comentarios del usuario en ediciones de ida y vuelta.
¿`--help` automático?
argparse genera la ayuda; completa description y epilog.
¿`nargs=+`?
Uno o más tokens posicionales se recopilan en una lista.
¿INI vs TOML?
Para configuraciones nuevas, prefiere tomllib/pyproject; configparser solo para INI heredado.
¿`pytest` con CLI?
Invoca main(argv) con una lista explícita; no confíes en la mutación global de sys.argv.
¿Autocompletado?
argcomplete (PyPI) es opcional; typer tiene rutas integradas de autocompletado de shell.
¿Comandos de administración de Django?
Django envuelve una API similar a argparse; separado de los scripts independientes.
Relacionado
- subprocess - Las herramientas CLI inician procesos
- pathlib & os - Rutas de configuración
- Descripción general de la biblioteca estándar - Mapa
- Mejores prácticas de la biblioteca estándar - Política de CLI/configuración
Versiones de la pila: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 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+ y uv 0.6+.