все Python 3Модули и импортпонятие
Пакет и __init__.py
пакеты
Пакет — каталог с модулями, импортируемый как pkg.mod. Файл __init__.py делает каталог обычным пакетом и выполняется при первом импорте пакета.
Синтаксис
pkg/
__init__.py
mod.py
import pkg.mod
from pkg import mod
from .mod import name # внутри пакета
__init__.py выполняется один раз — при первом import pkg или import pkg.mod — и всё, что в нём определено, становится атрибутами pkg; так из пакета «поднимают» удобные имена: from .prices import total. Подмодуль сам не становится атрибутом пакета: после import pkg обращение pkg.mod падает с AttributeError, пока pkg.mod не импортирован явно или из __init__.py. Каталог без __init__.py тоже импортируется — как пакет пространства имён (PEP 420, Python 3.3), у него __file__ равен None; это сделано для пакетов, разбросанных по нескольким каталогам, и легко скрывает опечатку в пути. Файл с именем модуля stdlib в каталоге скрипта (random.py, json.py) затеняет настоящий модуль: каталог скрипта стоит в sys.path первым.
Примеры
import os, sys
sys.path.insert(0, '.')
os.makedirs('shop', exist_ok=True)
with open('shop/__init__.py', 'w', encoding='utf-8') as f:
f.write("print('выполняется shop/__init__.py')\nfrom .prices import total\n")
with open('shop/prices.py', 'w', encoding='utf-8') as f:
f.write('def total(xs): return sum(xs)\n')
import shop # → выполняется shop/__init__.py
import shop.prices # пакет уже загружен: __init__.py второй раз не выполняется
print(shop.total([1, 2, 3])) # → 6
import os, sys
sys.path.insert(0, '.')
os.makedirs('notes', exist_ok=True) # каталог без __init__.py
import notes
print(notes.__file__) # → None — пакет пространства имён
import sys
sys.path.insert(0, '.') # так стоит каталог запущенного скрипта
with open('random.py', 'w', encoding='utf-8') as f:
f.write("print('это мой random.py')\n")
import random # → это мой random.py
print(hasattr(random, 'randint')) # → False — настоящий random затенён
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности