Lorsqu'un module est importé en Python, l'interpréteur le recherche dans les répertoires listés dans sys.path. Il recherche d'abord parmi les modules standard, puis parmi les fichiers .py, .pyc et les répertoires contenant le fichier __init__.py (paquets).
sys.modules.ModuleNotFoundError sera levée..pyc) et mis en cache (si des droits d'écriture sont disponibles).# mypkg/__init__.py (peut être vide) # mypkg/mod.py # main.py import mypkg.mod
__init__.py (pour Python <3.3 obligatoire) — tout cela a de l'importance.sys.path (le répertoire du script courant est toujours le premier).from . import ..., importation absolue/relative).Que se passera-t-il si un fichier nommé
random.pyse trouve dans le répertoire de votre script et que vous essayez d'importer le module standardrandom?
Le fichier LOCAL random.py sera importé, et non la bibliothèque standard. Une cause fréquente de bugs difficiles à identifier est la collision des noms de modules avec ceux des bibliothèques (shadowing). Il est important d’être vigilant avec le nommage des fichiers.
Histoire
Dans un grand projet, le module email.py a accidentellement éclipsé le module standard email de la bibliothèque, et les développeurs n'ont pas pu comprendre longtemps pourquoi les fonctions de parsing des emails provenant de bibliothèques tierces ne fonctionnaient pas.
Histoire
Dans un projet ML, la fonction os.path ne fonctionnait pas : à côté du script principal se trouvait un fichier os.py, qui interceptait toutes les demandes au module standard. Un mois a été consacré au débogage avant de trouver le conflit de noms.
Histoire
Dans une API REST microservices, des importations circulaires sont survenues lors d'une tentative de faire une importation relative des modèles entre plusieurs sous-paquets. Le problème n'a été résolu qu'après un refactoring de la structure du projet et un ordre explicite de chargement des modules.