Scripts et modules Python

PG121 - Modules, scripts et packages Python

Frédéric Herbreteau, Bordeaux INP/LaBRI (frederic.herbreteau@bordeaux-inp.fr)

Utiliser un module existant

>>> import math
>>> math.floor(2.3)
2
>>> math.lcm(6,3,5)
30
>>> import random as rd
>>> rd.seed(23700237)
>>> rd.randrange(10) # returns a random integer in 0..9
4

Le fichier .py du module doit se trouver dans le répertoire courant ou dans un répertoire listé dans la variable sys.path (extensible via la variable d’environnement PYTHONPATH)

Créer un nouveau module

  • Un module sert à structurer le code en unités fonctionnelles, qui peuvent être réutilisées dans d’autres programmes
  • Créer un fichier fact.py contenant:
def factorial(n):
    return 1 if n == 0 else n * factorial(n - 1)
  • Importer le fichier fact.py dans l’interface REPL:
>>> import fact
>>> help(fact)
>>> help(fact.factorial)
>>> fact.factorial(5)
120

Documenter un module

  • Renseigner help: docstrings """ """ (cf. PEP 257)
  • indications de typage (non vérifiées à l’exécution)
  • Quelques recommandations
"""
Module de calcul de la fonction factorielle

Ce module propose des implémentations de la fonction factorielle
"""

# Implémentation récursive directe de n!
def factorial(n : int ) -> int: 
    """Retourne la factorielle de n, avec n >= 0."""
    return 1 if n == 0 else n * factorial(n - 1)

Large bibliothèque de modules

  • Bibliothèque standard Python (cf. index des modules): re, math, random, os, io, argparse, threading, json, tkinter, pdb, sys,…
  • Bibliothèques annexes:
    • calcul scientifique: numpy, scipy
    • analyse de données: pandas
    • visualisation: matplotlib, plotly
    • apprentissage automaituqe: tensorflow, pytorch, scikit-learn, keras
    • programmation web: requests, flask (+ framework: django)
    • manipulation d’images: PIL/pillow, scikit-image, OpenCV-python
    • …..

Scripts

#!/usr/bin/env python

def factorial(n):
    """Retourne la factorielle de n, avec n >= 0."""
    return 1 if n == 0 else n * factorial(n - 1)

if __name__ == '__main__':
    n = int(input('Entrez un nombre >= 0: '))
    print(f'{n}! est égale à {factorial(n)}')
  • Exécution dans un shell: python fact.py ou ./fact.py (chmod u+x fact.py):
$ ./fact.py
Entrez un nombre >= 0: 5
5! est égale à 120
  • Toujours utilisable comme un module via import fact

Packages

my_module/
 |- __init__.py
 |- file1.py
 |- file2.py
 | - sub_module/
 |    |- __init__.py
...
  • les fichiers __init__.py peuvent être vides ou contenir du code
  • import my_module déclenche la recherche dans sys.path:
    • d’un fichier nommé my_module.py
    • ou d’un fichier my_module/__init__.py

Installation de modules et gestion de dépendances

  • installation et gestion des modules avec: pip, venv, conda, poetry,…
  • environnements virtuels venv pour gérer les dépendances spécifiques à chaque projet
$ python -m venv <directory>      # création d'un env. virtuel dans "directory"
$ source <directory>/bin/activate # activation de l'environnement
$ # utilisation de python, pip, etc (versions installées dans <directory>)
$ deactivate                      # désactivation de l'environnement
  • un environnement peut être activé et désactivé à volontée