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é.
%%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 :
import operations
operations.addition(2, 4)
import operations as op
op.addition(2, 4)
from operations import addition
addition(2, 4)
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
.
import operations
type(operations)
import
ajoute des attributs au module
import operations
print(f"name : {operations.__name__}")
print(f"file : {operations.__file__}")
print(f"doc : {operations.__doc__}")
! 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__
import operations_pack.simple
operations_pack.simple.addition(2, 4)
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 *
from operations_pack.avance import *
multi.multiplication(2,4)
Vous trouverez fréquemment le test suivant dans les scripts Python :
if __name__ == '__main__':
instruction1
instruction2
ou
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
Pour que import
fonctionne il faut que les modules soient dans le PATH.
import sys
sys.path
sys.path
est une liste, vous pouvez la modifier
sys.path.append("[...]") # le chemin vers le dossier operations_pack
sys.path
Dans les distributions Python récentes pip
est installé, tant mieux.
Avec pip
vous pouvez :
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.pip uninstall module
pip install module --upgrade
pip install module=0.9 --upgrade
pip freeze > requirements.txt
Ce qui vous permettra de le réinstaller sur une autre machine pip install -r requirements.txt
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
.