Modules python
Un module python est en réalité un fichier qui est lu lorsqu'il est importé.
Par exemple, le code suivant cherche un fichier random.py
qu'il exécute dans son espace de nommage :
import random
Il est tout à fait possible, et on va le faire souvent par la suite de créer ses propres modules.
L'endroit où l'interpréteur cherche les modules locaux dépend de l'endroit où il est exécuté. Nous rentrerons dans ces détails plus tard, mais pour l'instant on considère que vous avez suivi les consignes du tutoriel vscode et python :
- vous avez créé un projet avec vscode
- que tous les fichiers que vous créez sont dans le dossier du projet
- que vous exécutez le code en utilisant le triangle vert
Ces consignes précédentes assurent que vous exécutez votre code python à partir du dossier contenant votre projet.
Préparons nos fichiers pour comprendre comment tout ça fonctionne :
Créez un nouveau projet avec vscode dans le dossier projet_module
. Dans ce projet, créez les deux fichiers mon_module.py
et mon_programme.py
tels que :
Fichier mon_programme.py
:
import mon_module
print(mon_module.MA_CONSTANTE)
Fichier mon_module.py
:
MA_CONSTANTE = 42
va_variable = None
Mécanisme d'importation de modules
Exécutez le fichier mon_programme.py
.
Vous devriez voir s'afficher 42
dans le terminal de vscode. Examinons comment tout ça se passe. Lorsque l'interpréteur python exécute la première ligne du fichier :
import mon_module
Process d'import :
L'interpréteur procède en deux temps pour exécuter la ligne d'import :
import mon_module
- il cherche dans le dossier d'exécution s'il existe un fichier nommé
mon_module.py
. Si ce fichier n'existe pas il passe à l'étape 2, sinon il passe à l'étape 4. - il cherche dans ses dossiers à lui s'il existe un fichier nommé
mon_module.py
. Si ce fichier n'existe pas il passe à l'étape 3. - il produit une erreur d'importation :
ModuleNotFoundError: No module named 'mon_module'
- il exécute le fichier
mon_module.py
dans un nouvel espace de nommage créé pour lui.
À la fin de la première instruction on est dans la situation suivante :
Le nom mon_module
correspond à un objet de type module, contenant un espace de nommage. On peut accéder aux noms de son espace avec la notation pointée :
mon_module.MA_CONSTANTE
On cherche le nom MA_CONSTANTE
dans l'espace de nom associé à l'objet de nom mon_module
.
Créez un projet vscode et créez le fichier main.py
suivant que vous exécuterez :
import math
print(math.pi)
Explicitez comment s'est exécuté le programme.
corrigé
corrigé
Exactement comme pour le fichier mon_programme.py
, sauf que l'interpréteur est passé à l'étape 2 et a trouvé un fichier nommé math.py
dans ses propres fichiers qu'il a exécuté.
Ajoutez au projet un fichier math.py
vide et exécutez à nouveau le fichier main.py
. Que doit-il se passer ?
corrigé
corrigé
L'interpréteur trouve le fichier math.py
dans le projet et l'a exécuté. Comme ce fichier ne contient pas de variable pi
, le programme plante avec le message d'erreur :
AttributeError: module 'math' has no attribute 'pi'
Vous pouvez vous convaincre que le fichier est bien exécuté en ajoutant la ligne suivant dans le fichier mon_module.py
:
print("coucou de l'import")
En exécutant le fichier mon_programme.py
, vous devriez voir s'afficher "coucou de l'import"
dans le terminal. C'est pour cette raison que :
Les fichiers utilisés comme modules ne doivent contenir que des déclarations de fonctions ou des variables. Ils ne doivent comporter aucun affichage ni interactions avec l'utilisateur (via des input
par exemple) pour ne pas gêner le processus d'import.