Шаг 132.
Основы языка Python.
Модули и пакеты. Пакеты (окончание)

    На этом шаге мы закончим изучение пакетов.

    До сих пор мы рассматривали импортирование модулей из основной программы. Теперь рассмотрим импорт модулей внутри пакета. В этом случае инструкция 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

    Со следующего шага мы начнем изучать объектно-ориентированное программирование (ООП).




Предыдущий шаг Содержание Следующий шаг