Wenn in Python ein Modul importiert wird, sucht der Interpreter es in den Verzeichnissen, die in sys.path aufgelistet sind. Zuerst wird unter den Standardmodulen gesucht, dann unter den .py, .pyc-Dateien und Verzeichnissen mit der __init__.py-Datei (Pakete).
sys.modules entnommen.ModuleNotFoundError ausgelöst..pyc) kompiliert und zwischengespeichert (wenn Schreibrechte vorhanden sind).# mypkg/__init__.py (kann leer sein) # mypkg/mod.py # main.py import mypkg.mod
__init__.py (für Python <3.3 zwingend erforderlich) — all dies ist wichtig.sys.path gesucht (zuerst immer das Verzeichnis des aktuellen Skripts).from . import ..., absoluter/relativer Import).Was passiert, wenn im Verzeichnis mit Ihrem Skript eine Datei mit dem Namen
random.pyliegt und Sie versuchen, das Standardmodulrandomzu importieren?
Es wird MEINE lokale Datei random.py importiert, nicht die Standardbibliothek. Eine häufige Ursache für schwer zu findende Bugs sind Namenskonflikte von Modulen mit Bibliotheken (Shadowing). Vorgänge mit der Benennung von Dateien sollten aufmerksam behandelt werden.
Geschichte
In einem großen Projekt hat das Modul email.py zufällig das Standardmodul email aus der Bibliothek überschattet, und die Entwickler konnten lange Zeit nicht verstehen, warum die Funktionen zum Parsen von E-Mails aus Drittbibliotheken nicht funktionierten.
Geschichte
In einem ML-Projekt funktionierte die Funktion os.path nicht: Neben dem Hauptskript befand sich die Datei os.py, die alle Aufrufe des Standardmoduls abfing. Ein Monat wurde mit der Fehlersuche verbracht, bevor der Namenskonflikt gefunden wurde.
Geschichte
In einem mikroservicebasierten REST API traten zirkuläre Importe auf, als versucht wurde, relative Importe von Modellen zwischen mehreren Subpaketen zu machen. Das Problem wurde erst nach der Umstrukturierung des Projekts und einer expliziten Reihenfolge der Modul-Ladung gelöst.