Connaître les modules chargés avec sys.modules en Python

1. À propos de sys.modules

Le module sys fournit l'attribut sys.modules qui permet d'accéder aux modules actuellement chargés dans le processus Python.

sys.modules est un dictionnaire. Ses clés correspondent aux noms des modules et ses valeurs correspondent aux objets modules déjà chargés.

Le programme suivant affiche le type de sys.modules.

Sortie :

Il faut remarquer que Python charge déjà plusieurs modules au démarrage. sys.modules n'est donc généralement pas vide même si notre programme ne contient qu'un seul import sys.

2. Afficher les modules chargés avec sys.modules

Puisque sys.modules est un dictionnaire, nous pouvons parcourir ses clés pour afficher les noms des modules actuellement chargés.

Le programme suivant affiche les noms des modules présents dans sys.modules.

Sortie possible :

La liste exacte dépend de la version de Python, du système d'exploitation, de l'environnement d'exécution et des modules précédemment importés.

Pour obtenir un affichage plus pratique, nous pouvons trier les noms des modules avec sorted().

Sortie possible :

3. Comprendre la structure de sys.modules

sys.modules est un dictionnaire dont les clés sont généralement les noms utilisés par le système d'importation et dont les valeurs sont les objets modules correspondants.

Nous pouvons par exemple récupérer l'objet associé au module sys.

Sortie possible :

Nous pouvons donc représenter de manière simplifiée une partie de sys.modules sous la forme suivante :

Sortie :

Cette représentation est uniquement destinée à expliquer la structure du dictionnaire. Le contenu réel de sys.modules est beaucoup plus important.

4. Vérifier si un module est déjà chargé

L'opérateur in permet de vérifier facilement si le nom d'un module est présent dans sys.modules.

Le programme suivant vérifie si le module sys est déjà chargé.

Sortie :

Nous pouvons observer l'effet d'un import sur sys.modules. Dans l'exemple suivant, nous testons la présence du module fractions avant et après son importation.

Sortie possible :

La première valeur peut dépendre de l'environnement : si fractions avait déjà été chargé auparavant, le premier test retournerait également True. Dans un processus Python classique où il n'a pas encore été importé, l'exemple montre son apparition dans sys.modules après l'importation.

5. Récupérer un module depuis sys.modules

Comme sys.modules est un dictionnaire, nous pouvons récupérer directement un module déjà chargé à partir de son nom.

Le programme suivant importe le module math puis récupère l'objet correspondant depuis sys.modules.

Sortie possible :

Le chemin affiché dépend de l'installation de Python.

L'objet récupéré peut être utilisé comme le module importé normalement. Nous pouvons par exemple appeler sa fonction sqrt().

Sortie :

Dans ce cas, math et sys.modules["math"] désignent le même objet module.

Sortie :

6. Connaître le nombre de modules chargés

Puisque sys.modules est un dictionnaire, la fonction len() permet de connaître le nombre d'entrées actuellement présentes.

Le programme suivant affiche ce nombre.

Sortie possible :

Le nombre exact varie selon la version de Python et l'environnement utilisé.

Nous pouvons également observer comment ce nombre peut évoluer après l'importation de nouveaux modules.

Sortie possible :

Le nombre d'entrées ajoutées peut être supérieur au nombre d'instructions import, car un module peut lui-même importer d'autres modules nécessaires à son fonctionnement.

7. Comprendre le rôle de sys.modules lors d'un import

sys.modules joue un rôle essentiel dans le système d'importation de Python. Lorsqu'un module est importé et chargé, il est normalement enregistré dans ce dictionnaire.

Lors d'un nouvel import, Python consulte notamment sys.modules. Si le module demandé y est déjà présent, l'objet module existant peut être réutilisé au lieu d'être chargé à nouveau de la manière habituelle.

Le programme suivant montre que deux instructions import math successives donnent accès au même objet module.

Sortie :

Nous pouvons également comparer directement le module avec l'entrée correspondante dans sys.modules.

Sortie :

Ce mécanisme évite notamment de recréer inutilement le même objet module lors de chaque instruction import dans un même processus Python.

8. Obtenir le chemin d'un module chargé

De nombreux modules possèdent un attribut __file__ indiquant le chemin du fichier à partir duquel le module a été chargé. Nous pouvons utiliser sys.modules pour accéder au module puis consulter cet attribut.

Le programme suivant affiche le chemin du module random.

Sortie possible sous Windows :

Le chemin exact dépend de l'installation de Python.

Tous les modules ne possèdent cependant pas nécessairement un fichier Python associé accessible avec __file__. C'est notamment le cas de certains modules intégrés. Il est donc préférable d'utiliser getattr() lorsque nous voulons traiter différents types de modules.

Sortie possible :

Cette technique permet d'éviter une erreur lorsque l'attribut __file__ n'existe pas.

9. Précautions lors de la modification de sys.modules

sys.modules est un dictionnaire modifiable, mais il représente une partie fondamentale du mécanisme d'importation de Python. Il est donc généralement déconseillé de modifier ou de supprimer ses entrées sans raison précise.

Pour comprendre ce comportement sans modifier le dictionnaire, le programme suivant crée une copie de sys.modules puis supprime une entrée uniquement dans cette copie.

Sortie :

La suppression a uniquement affecté copie. Le véritable dictionnaire sys.modules contient toujours le module math.

Pour parcourir sys.modules de manière sûre lorsque le code exécuté pendant la boucle pourrait provoquer de nouveaux imports, nous pouvons également travailler sur une copie de ses éléments.

Sortie possible :

L'ordre et le contenu exacts peuvent varier selon l'environnement. Dans les programmes courants, sys.modules est surtout utilisé pour inspecter les modules chargés plutôt que pour modifier directement le fonctionnement du système d'importation.

10. À retenir !

sys.modules est un dictionnaire utilisé par le système d'importation de Python pour conserver les modules déjà chargés dans le processus courant.

  • sys.modules est un objet de type dict.
  • Ses clés correspondent aux noms des modules chargés.
  • Ses valeurs correspondent aux objets modules associés.
  • "math" in sys.modules permet de vérifier si le nom du module math est présent.
  • sys.modules["math"] permet de récupérer l'objet module correspondant lorsqu'il existe.
  • len(sys.modules) permet de connaître le nombre d'entrées actuellement enregistrées.
  • Un module importé peut lui-même provoquer le chargement d'autres modules.
  • Python consulte sys.modules dans son mécanisme d'importation afin de réutiliser les modules déjà chargés.
  • L'attribut __file__ permet de connaître le fichier associé à de nombreux modules, mais il n'existe pas pour tous les modules.
  • Il est généralement préférable de ne pas modifier directement sys.modules sans comprendre précisément les conséquences sur le système d'importation.

Le programme suivant rassemble les principales opérations permettant d'inspecter un module chargé avec sys.modules.

Sortie possible :

 


 


Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/


Leave a Reply

Your email address will not be published. Required fields are marked *