Wanneer er in Python een module wordt geïmporteerd, zoekt de interpreter deze in de directories die zijn vermeld in sys.path. Eerst zoekt hij tussen de standaardmodules, daarna tussen de bestanden .py, .pyc en directories met het bestand __init__.py (pakketten).
sys.modules.ModuleNotFoundError opgegooid..pyc) en gecached (indien schrijfrechten aanwezig zijn).# mypkg/__init__.py (kan leeg zijn) # mypkg/mod.py # main.py import mypkg.mod
__init__.py (voor Python <3.3 verplicht) — alles doet er toe.sys.path (de directory van het huidige script gaat altijd als eerste).from . import ..., absoluut/relatief import).Wat gebeurt er als er een bestand met de naam
random.pyin de directory met uw script staat en u probeert de standaardmodulerandomte importeren?
Er wordt MIJN lokale bestand random.py geïmporteerd en niet de standaardbibliotheek. Een veelvoorkomende oorzaak van moeilijk op te sporen bugs zijn naamconflicten van modules met bibliotheken (shadowing). Het is belangrijk om zorgvuldig om te gaan met bestandsnamen.
Verhaal
In een groot project overschaduwde de module email.py per ongeluk de standaardmodule email uit de bibliotheek, en de ontwikkelaars konden lange tijd niet begrijpen waarom de e-mailparserfuncties uit externe bibliotheken niet werkten.
Verhaal
In een ML-project werkte de functie os.path niet: naast het hoofdscript was er een bestand os.py, dat alle aanroepen naar de standaardmodule onderschepte. Er werd een maand besteed aan debugging, voordat het naamconflict werd gevonden.
Verhaal
In een microservices REST API ontstonden circulaire imports bij het proberen een relatieve import van modellen tussen verschillende subpakketten te maken. Het probleem werd pas opgelost na het refactoren van de projectstructuur en een expliciete volgorde van module-lading.