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 :

  1. vous avez créé un projet avec vscode
  2. que tous les fichiers que vous créez sont dans le dossier du projet
  3. 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
  1. 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.
  2. 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.
  3. il produit une erreur d'importation : ModuleNotFoundError: No module named 'mon_module'
  4. 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 :

import

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é

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é

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.