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

    На этом шаге мы рассмотрим особенности использования пакетов.

    Пакетом называется каталог с модулями, в котором расположен файл инициализации __init__.py. Файл инициализации может быть пустым или содержать код, который будет выполнен при первом обращении к пакету. В любом случае он обязательно должен присутствовать внутри каталога с модулями.

    В качестве примера создадим следующую структуру файлов и каталогов:

main.py                 # Основной файл с программой
folder1\                # Папка  на  одном уровне вложенности с main.py
    __init__.py         # Файл инициализации
    module1.py          # Модуль   folder1\module1.py
    folder2\	        # Вложенная папка
        __init__.py     # Файл инициализации
        module2.py      # Модуль  folder1\folder2\module2.py
        module3.ру      # Модуль  folder1\folder2\module3.ру

    Содержимое файлов __init__.py:

# -*- coding: utf-8 -*-
print ("__init__ из",__name__)

    Содержимое модулей module1.py, module2.py и module3.py:

# -*- coding: utf-8  -*-
msg = "Модуль {0}".format(__name__)

    Теперь импортируем эти модули в основном файле main.py и получим значение переменной msg разными способами. Файл main.py будем запускать с помощью двойного щелчка на значке файла.

    Содержимое файла main.py:

#-*- coding: utf-8 -*-

# Доступ к модулю folderl\modulel.py
import folder1.module1 as m1
                # Выведет: __init__ из folder1
print(m1.msg)	# Выведет: Модуль folder1.module1
from folder1 import module1 as m2
print(m2.msg)	# Выведет: Модуль folder1.module1
from folder1.module1 import msg
print(msg)	# Выведет: Модуль folder1.module1

# Доступ к модулю folder1\folder2\module2.py
import folder1.folder2.module2 as m3
# Выведет: __init__ из folderl.folder2
print(m3.msg)	# Выведет: Модуль folder1.folder2.module2
from folder1.folder2 import module2 as m4
print(m4.msg)	# Выведет: Модуль folder1.folder2.module2
from folder1.folder2.module2 import msg
print(msg)      # Выведет: Модуль folder1.folder2.module2
input ()
Архив с файлами и папками можно взять здесь.

    Результат работы приложения приведен на рисунке 1.


Рис.1. Результат работы приложения

    Как видно из примера, пакеты позволяют распределить модули по каталогам. Чтобы импортировать модуль, расположенный во вложенном каталоге, необходимо указать путь к нему, перечислив имена каталогов через точку. Если модуль расположен в каталоге C:\folder1\folder2\, то путь к нему из С:\ должен быть записан так: folder1.foider2. При использовании инструкции import путь к модулю должен включать не только названия каталогов, но и название модуля без расширения:

  import folder1.folder2.module2

    Получить доступ к идентификаторам внутри импортированного модуля можно следующим образом:

  print(folder1.folder2.module2.msg)

    Так как постоянно указывать столь длинный идентификатор очень неудобно, можно создать псевдоним, указав его после ключевого слова as, и обращаться к идентификаторам модуля через него:

  import  folder1.folder2.module2  as m 
  print(m.msg)

    При использовании инструкции from можно импортировать как объект модуля, так и определенные идентификаторы из модуля. Чтобы импортировать объект модуля, его название следует указать после ключевого слова import:

  from folder1.folder2  import module2 
  print(module2.msg)

    Для импортирования только определенных идентификаторов название модуля указывается в составе пути, а после ключевого слова import через запятую перечисляются идентификаторы:

  from folder1.folder2.module2 import msg
  print (msg)

    Если необходимо импортировать все идентификаторы из модуля, то после ключевого слова import указывается символ *:

  from folder1.folder2.module2 import * 
  print (msg)

    Инструкция from позволяет также импортировать сразу несколько модулей из пакета. Для этого внутри файла инициализации __init__.py в атрибуте __all__ необходимо указать список модулей, которые будут импортироваться с помощью выражения from пакет import *.

    В качестве примера изменим содержимое файла __init__.py из каталога folder1\folder2\:

# -*- coding: utf-8 -*-
# print ("__init__ из",__name__)
__all__ = ["module2", "module3"]

    Теперь изменим содержимое основного файла main.py и запустим его.

#-*- coding: utf-8 -*-

from folder1.folder2 import *
print(module2.msg)	# Выведет: Модуль folder1.folder2.module2
print(module3.msg)	# Выведет: Модуль folder1.folder2.module3
input ()
Архив с файлами и папками можно взять здесь.

    Результат работы приложения приведен на рисунке 2.


Рис.1. Результат работы приложения

    Как видно из примера, после ключевого слова from указывается лишь путь к каталогу без имени модуля. В результате выполнения инструкции from все модули, указанные в списке __all__, будут импортированы в пространство имен модуля main.py.

    На следующем шаге мы закончим изучение этого вопроса.




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