все Python 3Модули и импортконструкция
import / from … import
импорт
Подключает модуль: import m даёт имя m, from m import x — имя x, as переименовывает. Точка в начале (from . import x) — импорт относительно своего пакета.
Синтаксис
import module [as name]
from module import name [as alias], …
from module import *
from . import sibling
from ..pkg import name
Модуль выполняется один раз — при первом импорте — и кэшируется в sys.modules: повторный import его не перечитывает, поэтому правка файла в уже запущенной программе не видна. from m import x копирует ссылку в момент импорта: если потом присвоить m.x новое значение, ваш x останется старым. from m import * берёт имена из __all__, а без него — все имена без подчёркивания в начале. При циклическом импорте второй модуль получает первый недовыполненным, и from a import x падает с ImportError «partially initialized module». Относительный импорт работает только внутри пакета: в файле, запущенном напрямую (python file.py), он падает — запускайте python -m пакет.модуль.
Примеры
import math
from math import pi
math.pi = 3 # переприсвоили имя в модуле
print(math.pi) # → 3
print(pi) # → 3.141592653589793 — у нас осталась старая ссылка
import sys
sys.path.insert(0, '.') # искать модули и в текущем каталоге
with open('greet.py', 'w', encoding='utf-8') as f:
f.write("print('модуль выполняется')\n__all__ = ['hello']\ndef hello(): return 'hi'\ndef _hidden(): pass\n")
import greet # → модуль выполняется
import greet # повторно не выполняется: модуль уже в sys.modules
print('greet' in sys.modules) # → True
from greet import *
print(hello()) # → hi
print('_hidden' in dir()) # → False
# файл запущен напрямую, а не как часть пакета
from . import helper # → ImportError: attempted relative import with no known parent package
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности