Создание, импорт и установка пакетов

На предыдущем занятии мы с вами рассматривали способы создания и импортирования отдельных модулей в Python. Здесь углубимся в эту тему и поговорим о пакетах и способах их импорта.

Пакет (package) – это специальным образом организованный подкаталог с набором модулей, как правило, решающих сходные задачи.

Например, можно создать пакет для моделирования случайных значений с разными законами распределения. Для этого создадим каталог (придумываем имя сами):

packrand

в котором разместим следующие файлы (модули):

  • exp.py – для моделирования экспоненциальных величин;
  • normal.py – для моделирования нормальных величин;
  • rel.py – для моделирования релеевских значений;
  • funcs.py – набор вспомогательных функций.

и еще добавим специальный файл

__init__.py

который должен присутствовать в каждом пакете и в котором происходит его начальная инициализация (если она, конечно, нужна). В самом простом случае это может быть пустой файл. Но мы туда запишем одну переменную:

NAME = 'rand_package'

И обратите внимание. Для корректной обработки модулей в пакете, все файлы следует создавать с кодировкой UTF-8.

Остальные файлы пакета будут хранить следующую информацию (см. видео). Все, мы сформировали пакет и теперь можем его импортировать в нашу программу. Для этого записывается ключевое слово import и указывается имя пакета (название подкаталога):

import packrand

Давайте посмотрим, что в итоге было импортировано:

print( dir(packrand) )

Мы видим имя нашей переменной NAME и вспомогательные переменные, которые были созданы автоматически средой Python:

['NAME', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

Выведем значение переменной NAME:

print( packrand.NAME )

И в консоли отображается строчка, прописанная в файле __init__.py. Но все остальные модули при этому недоступны. Чтобы получить к ним доступ, необходимо их явно импортировать:

import packrand.normal

И далее, вызвать функцию этого модуля:

print( packrand.normal.randNorm() )

Либо, использовать второй вариант импорта через from:

from packrand.exp import randExp

и обращаться к функции непосредственно по ее имени:

print( randExp() )

Все эти способы импортирования называются абсолютными, так как здесь указывается полный путь к данным. Есть еще относительный импорт. И мы сейчас увидим как он работает. Но для начала посмотрим, как модули внутри пакета могут импортировать различные данные. Например, мы хотим внутри модуля exp.py выполнить импорт модуля funcs.py. Как это сделать? Если просто прописать:

import funcs

и запустить основную программу, то возникнет ошибка, что данный модуль не найден. Почему? Дело в том, что этот модуль находится внутри пакета (каталога) packrand и это явно нужно указать. Или так:

import packrand.funcs

или так:

from packrand import funcs

Но здесь возникает один тонкий момент. Что если название пакета в последствие поменяется? Тогда нам придется менять соответствующие импорты внутри модулей? Вот как раз здесь нам на помощь приходит относительный способ импортирования данных. Вместо явного указания пакета packrand, поставим точку:

from . import funcs

Эта точка означает текущий пакет, и теперь мы никак не связаны с его именем. Или, можно записать так:

from .funcs import getRand

здесь мы из модуля funcs текущего пакета импортируем функцию getRand. И так далее. Благодаря этой точке мы уходим от привязки к названию пакета и можем не беспокоиться об его изменении в будущем. Вот в этом преимущество относительного импорта. Однако, в основной программе лучше использовать абсолютную форму записи, т.к. это способствует лучшей читабельности текста программы, а это очень важно при разработке крупных проектов.

При работе с пакетами появляется особенность импортирования данных через звездочку:

from packrand import *

В результате будет импортированы только данные из модуля __init__.py, то есть, переменная NAME:

print( NAME )

а вот остальные модули будут недоступны:

print( normal.randNorm() )

Чтобы среда Python «знала» что импортировать при указании *, следует импортируемые данные перечислить в модуле __init__.py в виде такого списка:

__all__ = ["exp", "normal", "rel", "NAME"]

Здесь используется специальная переменная __all__, которая должна ссылаться на список с именами модулей, переменных, функций, которые мы предполагаем импортировать при таком синтаксисе. Теперь, запуская программу, она выполняется без ошибок, т.к.  необходимые модули были успешно добавлены.

Установка пакетов (pip)

Все рассмотренные способы импортов модулей и пакетов будут работать только для стандартных пакетов, либо созданных самостоятельно. Однако, существует большое количество полезных сторонних разработок, которые также можно использовать в своей работе. Здесь я вкратце расскажу каким образом осуществляется установка таких сторонних пакетов в ОС Windows.

Сначала открываем командное окно (нажимаем Win+R и набираем команду cmd). Далее, используя пакетный менеджер питона (pip) (он, обычно, ставится автоматически при установке Python). Чтобы убедиться, что он работает, просто наберите pip и нажмите Enter. Если у вас появится вот такая информация, то значит, он установлен и работает. Далее, с помощью команды:

pip freeze

можно увидеть список установленных модулей. Если ничего не отображается, значит, сторонние модули еще не устанавливались.

Для инсталляции нового пакета, нужно набрать:

pip install <имя пакета или модуля>

Давайте для примера установим пакет flask – популярный мини-web фреймворк. Запишем команду:

pip install flask

после этого начнется установка этого пакета последней версии.

И, далее, выполняя команду pip freeze, увидим следующий список:

click==7.1.1
Flask==1.1.1
itsdangerous==1.1.0
Jinja2==2.11.1
MarkupSafe==1.1.1
Werkzeug==1.0.0

То есть, у нас установилась версия Flask 1.1.1. Как видите, для установки необходимо знать, что устанавливать – имена модулей. Все популярные сторонние разработки можно найти на специальном сайте

https://pypi.org

В строке поиска можно указать интересующую вас тему, например, vk и появится список модулей, связанных с работой ВКонтакте. Например, выберем любой модуль и вверху появится подсказка как инсталлировать этот модуль.

После инсталляции этот модуль можно импортировать и вызывать соответствующие функции.

Видео по теме