Quando in Python avviene l'importazione di un modulo, l'interprete lo cerca nelle directory elencate in sys.path. Prima cerca tra i moduli standard, poi tra i file .py, .pyc e le cartelle con il file __init__.py (pacchetti).
sys.modules.ModuleNotFoundError..pyc) e memorizzato nella cache (se ci sono diritti di scrittura).# mypkg/__init__.py (può essere vuoto) # mypkg/mod.py # main.py import mypkg.mod
__init__.py (per Python <3.3 obbligatorio) — tutto conta.sys.path (la directory dello script corrente viene sempre per prima).from . import ..., import assoluto/relativo).Cosa succede se nella directory con il tuo script c'è un file di nome
random.pye provi a importare il modulo standardrandom?
Viene importato IL MIO file locale random.py, non la libreria standard. Una causa comune di bug difficili da identificare — conflitti tra i nomi dei moduli e le librerie (shadowing). Bisogna prestare attenzione alla denominazione dei file.
Storia
In un grande progetto, il modulo email.py ha accidentalmente oscurato il modulo standard email dalla libreria, e gli sviluppatori non riuscivano a capire perché le funzioni di parsing della posta da librerie esterne non funzionassero.
Storia
In un progetto ML, la funzione os.path non funzionava: accanto allo script principale c'era un file os.py, che intercettava tutte le chiamate al modulo standard. Hanno passato un mese a fare debug, fino a trovare il conflitto di nomi.
Storia
In un'API REST microservizi sono emersi import ciclici nel tentativo di fare un'importazione relativa dei modelli tra diversi sottopacchetti. Hanno risolto il problema solo dopo aver rifattorizzato la struttura del progetto e stabilito un ordine esplicito di caricamento dei moduli.