2. Bibliothèque standard🔗

Python dispose d'une très riche bibliothèque de modules étendant les capacités du langage dans de nombreux domaines: nouveaux types de données, interactions avec le système, gestion des fichiers et des processus, protocoles de communication (internet, mail, FTP, etc.), multimédia, etc.

2.1. Interface en ligne de commande (Command Line Interface)🔗

Utilisation de sys.argv

Le module sys permet un accès direct aux arguments de la ligne de commande, via la liste sys.argv: sys.argv[0] contient le nom du script executé, sys.argv[1] le nom du 1er argument (s'il existe), etc. P.ex.:

 1# Gestion simplifiée d'un argument entier sur la ligne de commande
 2import sys
 3
 4if sys.argv[1:]:
 5    # Présence d'au moins un argument sur la ligne de commande (outre le
 6    # nom du programme dans sys.argv[0])
 7    try:
 8        n = int(sys.argv[1])  # Essayer de convertir le 1er argument en entier
 9    except ValueError:
10        raise ValueError(f"L'argument {sys.argv[1]!r} n'est pas un entier")
11else:                         # Pas d'argument sur la ligne de commande
12    n = 101                   # Valeur par défaut en l'absence d'argument

Module argparse

Pour une gestion avancée des arguments et/ou options de la ligne de commande, il est préférable d'utiliser le module argparse. P.ex.:

 1    import argparse
 2
 3    parser = argparse.ArgumentParser(
 4        usage="%(prog)s [-p/--plot] [-i/--input coordfile | x1,y1 x2,y2 x3,y3]",
 5        description="Compute the circumscribed circle to 3 points in the plan.",
 6    )
 7    parser.add_argument(
 8        "coords",
 9        nargs="*", type=str, metavar="x,y",
10        help="Coordinates of point"
11    )
12    parser.add_argument(
13        "-i", "--input",
14        nargs="?", type=argparse.FileType("r"),
15        help="Coordinate file (one 'x,y' per line)",
16    )
17    parser.add_argument(
18        "-P", "--plot",
19        action="store_true", default=False,
20        help="Draw the circumscribed circle",
21    )
22    parser.add_argument(
23        "-T", "--tests",
24        action="store_true", default=False,
25        help="Run doc tests"
26    )
27    parser.add_argument("--version", action="version", version=__version__)
28
29    args = parser.parse_args()

Cette solution génère automatiquement une aide en ligne, p.ex.:

$ python3 circonscrit.py -h
usage: circonscrit.py [-p/--plot] [-i/--input coordfile | x1,y1 x2,y2 x3,y3]

Compute the circumscribed circle to 3 points in the plan.

positional arguments:
  x,y                   Coordinates of point

optional arguments:
  -h, --help            show this help message and exit
  -i [INPUT], --input [INPUT]
                        Coordinate file (one 'x,y' per line)
  -p, --plot            Draw the circumscribed circle
  -T, --tests           Run doc tests
  --version             show program's version number and exit

Exercice:

Interface en ligne de commande ★

2.2. Pickle: sérialisation des données🔗

Le module pickle permet la sauvegarde pérenne d'objets python (« sérialisation »).

>>> d = dict(a=1, b=2, c=3)
>>> l = ["Calvin", 6, 1.20]
>>> import pickle
>>> pkl = open('archive.pkl', 'wb')        # Overture du fichier en écriture binaire
>>> pickle.dump((d, l), pkl, protocol=-1)  # Sérialisation du tuple (d, l)
>>> pkl.close()                            # *IMPORTANT!* Fermeture du fichier
>>> d2, l2 = pickle.load(open('archive.pkl', 'rb')) # Désérialisation (relecture)
>>> (d == d2) and (l == l2)
True

Attention

les pickles ne sont pas un format d'échange de données. Ils sont spécifiques à python, et peuvent dépendre de la machine utilisée. Ils peuvent en outre constituer une faille de sécurité.

2.3. Batteries included🔗

Quelques modules de la bibliothèque standard qui peuvent être d'intérêt:

  • math: accès aux fonctions mathématiques réelles

    >>> math.asin(math.sqrt(2) / 2) / math.pi * 180
    45.00000000000001
    
  • cmath: accès aux fonctions mathématiques complexes

    >>> cmath.exp(cmath.pi * 1j) + 1
    1.2246467991473532e-16j
    
  • fractions: définition des nombres rationnels

    >>> print(fractions.Fraction(2, 3) + fractions.Fraction(5, 6))
    3/2
    >>> print(fractions.Fraction(*(3.5).as_integer_ratio()))
    7/2
    
  • random: générateurs de nombres aléatoires

    >>> random.sample(range(10), 3)  # Échantillon de 3 éléments sans remplacement
    [9, 1, 6]
    >>> random.gauss(0, 1)           # Distribution normale centrée réduite
    0.1245612752121385
    
  • autres modules numériques et mathématiques;

  • collections définit de nouveaux types spécialisés, p.ex. collections.OrderedDict, un dictionnaire ordonné, ou collections.namedtuple(), pour la création d'objets simples:

    >>> Point = collections.namedtuple("Point", "x y")
    >>> p = Point(3, 4)
    >>> print(p)
    Point(x=3, y=4)
    >>> (p.x**2 + p.y**2)**0.5
    5.0
    
  • functools est une collection d'outils s'appliquant sur des fonctions (mémorisation, fonction partielle, fonction générique, wrapping, etc.)

  • itertools fournit des générateurs de boucle (itérateurs) et de combinatoire:

    >>> [ ''.join(item) for item in itertools.combinations('ABCD', 2) ]
    ['AB', 'AC', 'AD', 'BC', 'BD', 'CD']
    
  • interactions avec le système:

    • sys, os: interface système, pathlib: manipulation des noms et chemins de fichiers,

    • shutil: opérations sur les fichiers (copy, move, etc.),

    • subprocess: éxécution de commandes système,

    • glob: métacaractères du shell (p.ex. toto?.*);

  • lecture et sauvegarde des données (outre pickle):

    • csv: lecture/sauvegarde de fichiers CSV,

    • configparser: fichiers de configuration,

    • json: lightweight data interchange format;

2.4. Text/Graphical User Interfaces🔗

Bibliothèques externes: