Gdy w Pythonie następuje import modułu, interpreter szuka go w katalogach wymienionych w sys.path. Najpierw szuka wśród standardowych modułów, następnie wśród plików .py, .pyc oraz katalogów zawierających plik __init__.py (pakiety).
sys.modules.ModuleNotFoundError..pyc) i buforowany (jeśli są odpowiednie uprawnienia do zapisu).# mypkg/__init__.py (może być pusty) # mypkg/mod.py # main.py import mypkg.mod
__init__.py (dla Pythona <3.3 obowiązkowa) — wszystko ma znaczenie.sys.path (zawsze pierwszym jest katalog bieżącego skryptu).from . import ..., import absolutny/relatywny).Co się stanie, jeśli w katalogu z twoim skryptem znajduje się plik o nazwie
random.pyi spróbujesz zaimportować standardowy modułrandom?
Zaimplementowany zostanie MÓJ lokalny plik random.py, a nie standardowa biblioteka. Częstą przyczyną trudnych do zdiagnozowania błędów są kolizje nazw modułów z bibliotekami (shadowing). Należy ostrożnie podchodzić do nazywania plików.
Historia
W dużym projekcie moduł email.py przypadkowo zastąpił standardowy moduł email z biblioteki, a programiści przez długi czas nie mogli zrozumieć, dlaczego nie działają funkcje parsowania maili z zewnętrznych bibliotek.
Historia
W projekcie ML funkcja os.path nie działała: obok głównego skryptu był plik os.py, który przechwytywał wszystkie odwołania do standardowego modułu. Miesiąc spędzono na debugowaniu, zanim znaleziono konflikt nazw.
Historia
W mikroserwisowym REST API wystąpiły cykliczne importy przy próbie wykonania relatywnego importu modeli między różnymi podpakietami. Problem rozwiązano dopiero po refaktoryzacji struktury projektu i wyraźnym porządku ładowania modułów.