langages de script – Python

Modules et packages

M1 Ingénierie Multilingue – INaLCO

clement.plancq@ens.fr

Les modules et les packages permettent d'ajouter des fonctionnalités à Python

Un module est un fichier (.py) qui contient des fonctions et/ou des classes.
Et de la documentation bien sûr

Un package est un répertoire contenant des modules et des sous-répertoires.

C'est aussi simple que ça. Évidemment en rentrant dans le détail c'est un peu plus compliqué.

Un module

In [ ]:
%%file operations.py

# -*- coding: utf-8 -*-

"""
Module pour le cours sur les modules
Opérations arithmétiques
"""

def addition(a, b):
    """ Ben une addition quoi : a + b """
    return a + b

def soustraction(a, b):
    """ Une soustraction : a - b """
    return a - b

Pour l'utiliser on peut :

  • l'importer par son nom
In [ ]:
import operations
operations.addition(2, 4)
  • l'importer et modifier son nom
In [ ]:
import operations as op
op.addition(2, 4)
  • importer une partie du module
In [ ]:
from operations import addition
addition(2, 4)
  • importer l'intégralité du module
In [ ]:
from operations import *
addition(2, 4)
soustraction(4, 2)

En réalité seules les fonctions et/ou les classes ne commençant pas par '_' sont importées.

L'utilisation de import * n'est pas recommandée. Parce que, comme vous le savez « explicit is better than implicit ». Et en ajoutant les fonctions dans l'espace de nommage du script vous pouvez écraser des fonctions existantes.

Ajoutez une fonction print à votre module pour voir (attention un module n'est chargé qu'une fois, vous devrez relancer le kernel ou passer par la console).

Autre définition d'un module : c'est un objet de type module.

In [ ]:
import operations
type(operations)

import ajoute des attributs au module

In [ ]:
import operations

print(f"name : {operations.__name__}")
print(f"file : {operations.__file__}")
print(f"doc : {operations.__doc__}")

Un package

In [ ]:
! tree operations_pack

Un package python peut contenir des modules, des répertoires et sous-répertoires, et bien souvent du non-python : de la doc html, des données pour les tests, etc…

Le répertoire principal et les répertoires contenant des modules python doivent contenir un fichier __init__.py

__init__.py peut être vide, contenir du code d'initialisation ou contenir la variable __all__

In [ ]:
import operations_pack.simple
operations_pack.simple.addition(2, 4)
In [ ]:
from operations_pack import simple
simple.soustraction(4, 2)

__all__ dans __init__.py définit quels seront les modules qui seront importés avec import *

In [ ]:
from operations_pack.avance import *
multi.multiplication(2,4)

Pas de main en Python ?

Vous trouverez fréquemment le test suivant dans les scripts Python :

In [ ]:
if __name__ == '__main__':
    instruction1
    instruction2

ou

In [ ]:
def main():
    instruction

if __name__ == '__main__':
    main()

Cela évite que le code sous le test ne soit exécuté lors de l'import du script : name est une variable créée automatiquement qui vaut main si le script a été appelé en ligne de commande, le nom du script s'il a été importé.

Accessoirement cela permet d'organiser son code et de le rendre plus lisible Désormais je vous recommande vivement demande de l'inclure dans tous vos scripts

Où sont les modules et les packages ?

Pour que import fonctionne il faut que les modules soient dans le PATH.

In [ ]:
import sys
sys.path

sys.path est une liste, vous pouvez la modifier

In [ ]:
sys.path.append("[...]") # le chemin vers le dossier operations_pack
sys.path

Installer des modules et des packages

Dans les distributions Python récentes pip est installé, tant mieux.

Avec pip vous pouvez :

  • installer un module pip install module ou pip install --user module pip va trouver le module sur Pypi et l'installer au bon endroit s'il existe. Il installera les dépendances aussi.
  • désinstaller un module pip uninstall module
  • mettre à jour pip install module --upgrade
  • downgrader dans une version particulière pip install module=0.9 --upgrade
  • sauvegarder votre environnement de dév, la liste de vos modules pip freeze > requirements.txt Ce qui vous permettra de le réinstaller sur une autre machine pip install -r requirements.txt

S'en sortir avec les versions

Python évolue au fil des versions, les packages aussi. Ça peut poser des problèmes quand vous voulez partager votre code ou même quand vous voulez utiliser un code qui a besoin d'une version particulière.

Il existe un outil pour isoler les environnement de développement : virtualenv
virtualenv /path/mon_projet ou python3 -m venv /path/mon_projet va créer un dossier avec plein de trucs dedans, y compris un interpréteur python.
Vous pouvez spécifier la version de python avec virtualenv /path/mon_projet -p /usr/bin/python3.6

Pour activer l'environnement : source /path/mon_projet/bin/activate (/path/mon_projet/Scripts/activate.bat sous Windows (je crois))
Pour en sortir : deactivate

Quand vous travaillez dans un venv les modules que vous installerez avec pip seront isolés dans le venv et pas ailleurs.
Si vous utilisez python ce sera la version de l'interpréteur du venv et les modules du venv.
Avec cet outil on doit installer à chaque fois les modules désirés mais au moins on ne s'embrouille pas. Et vous pouvez communiquer un fichier requirements.txt à un collègue qui pourra reproduire le venv sur sa machine.

Il existe aussi pipenv, un outil plus récent qui combine pip et virtualenv.