Retour au cours

argparse : scripts en ligne de commande

argparse permet de créer des scripts ergonomiques avec --help, options et validations.

objectifs

  • définir un parser et des arguments
  • générer une aide (-h/--help)
  • retourner des codes de sortie corrects

explication détaillée

  • ArgumentParser(prog, description)
  • add_argument() : positionnels, flags (action='store_true'), types
  • parse_args() retourne args
  • sys.exit(code) pour signaler l’état au shell

exemples exécutables

# greet.py
import argparse

def main(argv=None):
    p = argparse.ArgumentParser(prog="greet", description="saluer une personne")
    p.add_argument("name")
    p.add_argument("--upper", action="store_true", help="afficher en majuscules")
    args = p.parse_args(argv)
    msg = f"salut {args.name}"
    print(msg.upper() if args.upper else msg)

if __name__ == "__main__":
    main()
python greet.py alex --upper
# wc.py : compter lignes/mots/caractères
import argparse, sys, re
def main(argv=None):
    p = argparse.ArgumentParser(prog="wc")
    p.add_argument("path")
    p.add_argument("--lines", action="store_true")
    p.add_argument("--words", action="store_true")
    p.add_argument("--chars", action="store_true")
    args = p.parse_args(argv)
    try:
        text = open(args.path, encoding="utf-8").read()
    except OSError as e:
        print(f"erreur: {e}", file=sys.stderr)
        sys.exit(1)
    out = []
    if args.lines or not any([args.lines, args.words, args.chars]):
        out.append(("lignes", text.count("\n")+1 if text else 0))
    if args.words:
        out.append(("mots", len(re.findall(r"\w+", text))))
    if args.chars:
        out.append(("chars", len(text)))
    for k,v in out:
        print(f"{k}: {v}")
if __name__ == "__main__":
    main()

bonnes pratiques

  • messages d’erreur clairs → stderr + code ≠ 0
  • --help soigné (descriptions, exemples)
  • sous‑commandes via add_subparsers() pour gros outils

pièges courants

  • parser global créé au niveau module → compliqué à tester
  • confusion entre type=int et choices=[...]
  • ne pas gérer les erreurs d’IO

exercices

  1. réécrire wc avec sous‑commandes count-lines, count-words, count-chars.
  2. ajouter --out file pour écrire le résultat.
  3. valider et normaliser une option --lang parmi {fr,en}.