На этом шаге мы закончим изучение пакетов.
До сих пор мы рассматривали импортирование модулей из основной программы. Теперь рассмотрим импорт модулей внутри пакета. В этом случае инструкция from поддерживает относительный импорт модулей. Чтобы импортировать модуль, расположенный в том же каталоге, перед названием модуля указывается точка:
from .module import *
Чтобы импортировать модуль, расположенный в родительском каталоге, перед названием модуля указываются две точки:
from ..module import *
Если необходимо обратиться еще уровнем выше, то указываются три точки:
from ...module import *
Чем выше уровень, тем больше точек необходимо указать. После ключевого слова from можно указывать одни только точки - в этом случае имя модуля вводится после ключевого слова import. Пример:
from .. import module
Рассмотрим относительный импорт на примере. Для этого изменим содержимое модуля module3.py:
# -*- coding: utf-8 -*- # Импорт модуля module2.py из текущего каталога from . import module2 as m1 var1 = "Значение из: {0}".format(m1.msg) from .module2 import msg as m2 var2 = "Значение из: {0}".format(m2) # Импорт модуля module1.py из родительского каталога from .. import module1 as m3 var3 = "Значение из: {0}".format(m3.msg) from ..module1 import msg as m4 var4 = "Значение из: {0}".format(m4)
Теперь изменим содержимое основного файла main.py и запустим его с помощью двойного щелчка на значке файла.
#-*- coding: utf-8 -*- from folder1.folder2 import module3 as m print(m.var1) # Значение из: Модуль folder1.folder2.module2 print(m.var2) # Значение из: Модуль folder1.folder2.module2 print(m.var3) # Значение из: Модуль folder1.modulel print(m.var4) # Значение из: Модуль folder1.modulel input ()
Результат работы приложения приведен на рисунке 1.
Рис.1. Результат работы приложения
При импортировании модуля внутри пакета с помощью инструкции import важно помнить, что в Python 3 производится абсолютный импорт. Если при запуске Python-программы с помощью двойного щелчка на ее файле автоматически добавляется путь к каталогу с исполняемым файлом, то при импорте внутри пакета этого не происходит. Поэтому если изменить содержимое модуля module3.py показанным далее способом, то мы получим сообщение об ошибке или загрузим совсем другой модуль:
#-*- coding: utf-8 -*- import module2 # Ошибка! Поиск модуля по абсолютному пути var1 = "Значение из: {0}".format(module2.msg) var2 = var3 = var4 = 0
В этом примере мы попытались импортировать модуль module2.py из модуля module3.py. При этом с помощью двойного щелчка мы запускаем файл main.py (последний). Поскольку импорт внутри пакета выполняется по абсолютному пути, поиск модуля module2.py не будет производиться в папке folder1\folder2\. В результате модуль не будет найден. Если в путях поиска модулей находится модуль с таким же именем, то будет импортирован модуль, который мы и не предполагали подключать.
Чтобы подключить модуль, расположенный в той же папке внутри пакета, необходимо воспользоваться относительным импортом с помощью инструкции from:
from . import module2
Или указать полный путь относительно корневого каталога пакета:
import folder1.folder2.module2 as module2
Со следующего шага мы начнем изучать объектно-ориентированное программирование (ООП).