Python. Импорт модуля. Последовательность действий

Импорт модуля. Последовательность действий: поиск-компиляция-запуск. Список sys.path. Схема выполненных действий

Данная тема есть продолжением темы:


Содержание


Поиск на других ресурсах:

1. Последовательность действий при выполнении импорта

Импорт модуля производится только один раз. Если повторно вызвать команду импорта модуля, она будет проигнорирована. При первом импорте другого модуля выполняются следующие операции времени выполнения:

  1. Находится файл модуля.
  2. Обнаруженный файл компилируется в байт-код, если это необходимо.
  3. Запускается программный код модуля. В результате создаются объекты, определенные в данном модуле.

 

2. Поиск модуля. Атрибут sys.path

При выполнении импорта первой операцией, выполняемой интерпретатором, является поиск местоположения файла модуля. В инструкции import расширения *.py не указывается, указывается только имя модуля. Также не указывается путь к каталогу, в котором имеется файл модуля.

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

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

Для установки имен каталогов, которые должны использоваться в программе, используется атрибут path модуля sys. Модуль sys входит в состав стандартной библиотеки. Имена каталогов задаются в виде списка строк.

Python. Импорт модулей. Просмотр содержимого файла sys.path

Рисунок 1. Просмотр содержимого файла sys.path командой File->Path Browser

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

  1. Текущий (домашний) каталог программы. Эта компонента определяется автоматически.
  2. Использование переменной окружения PYTHONPATH (если таковая определена). В этой переменной определен список имен каталогов с перечнем модулей, определенных пользователем и системой. Если переменная PYTHONPATH определена, то интерпретатор использует эту переменную для поиска путей к используемым модулям. Это случай, когда программисту (пользователю) необходимо импортировать модули, которые структурированы по каталогам (размещаются в разных каталогах).
  3. Использование каталогов стандартной библиотеки (см. п. 3). После выполнения пунктов 1, 2 производится поиск подключенных модулей в каталогах стандартной библиотеки. Эти каталоги автоматически подключаются интерпретатором, поэтому нет необходимости их настраивать вручную.
  4. Использование файла *.pth. В этом текстовом файле нужные каталоги задаются посредством списка строк.

Python. Модули. Последовательность источников при поиске модуля в списке sys.path

Рисунок 2. Последовательность источников при поиске модуля в списке sys.path

 

3. Использование модулей стандартной библиотеки Python. Пример

При создании программы на Python в распоряжении программиста доступно около 200 модулей стандартной библиотеки. Доступ к этим модулям осуществляется обычным способом с помощью инструкций import, from. Модули стандартной библиотеки можно использовать на любой платформе, где работает интерпретатор Python.

Модули стандартной библиотеки Python содержат средства решения наиболее распространенных задач программирования. К таким средствам можно отнести:

  • взаимосвязь (интерфейс) программы с операционной системой;
  • реализация разнотипных хранилищ объектов;
  • организация сетевой связи;
  • реализация известных шаблонов;
  • организация графического интерфейса пользователя;
  • математические средства;
  • средства разных видов обработки числовой информации;
  • библиотеки готовых решений визуализации изменяющихся процессов в пространстве;
  • другие средства.

Пример.

В примере приводится использование библиотек math и random. Первоначально формируется список пар случайных чисел с помощью средств модуля random. Эти пары представляют собой координаты точек на плоскости. Затем с помощью функции sqrt() модуля math получается список расстояний каждой точки до начала координат.

# 1. Подключить стандартные модули random и math
import random, math

# 2. Создать список пар случайных чисел.
#   Каждая пара это кортеж, определяющий координаты (x; y)
#   точки на плоскости.

# 2.1. Задать количество точек
n = input("n = ")

# 2.2. Цикл формирования списка точек
i = 0
L = [] # результирующий список

while i < n:
    # 2.2.1. Сформировать координаты x, y
    #        Использовать стандартную Функцию из модуля random
    x = random.randint(-10, 10) # x = [-10; 10]
    y = random.randint(-10, 10) # y = [-10; 10]

    # 2.2.2. Прибавить точку к списку L
    L = L + [(x, y)]

    # 2.2.3. Увеличить счетчик итераций цикла на 1
    i = i+1

# 3. Вывести список для контроля
print("L = ", L)

# 4. Сформировать список расстояний от точек до начала координат
L2 = [] # Список расстояний

for pt in L:
    # Вычислить расстояние от точки pt до начала координат
    length = math.sqrt(pt[0]*pt[0]+pt[1]*pt[1])

    # Добавить расстояние к списку L2
    L2 = L2 + [length]

# 5. Вывести список расстояний с точностью 2 знака после запятой
s = "" # Строка результата
for l in L2:
    s = s + ("%.2f" % (l)) + " "

print("L2 = ", s)

Результат

n = 6
L = [(5, 3), (-7, 9), (-8, -9), (6, -2), (-3, -6), (0, 5)]
L2 = '5.83 11.40 12.04   6.32 6.71 5.00   '

 

4. Компиляция. Получение байт-кода модуля (*.pyc). Схема выполненных действий

После поиска модуля, заданного в инструкции import, происходит следующий этап – этап компиляции. На этом этапе интерпретатор компилирует файл модуля в байт-код, если это нужно. Файл с байт-кодом имеет расширение *.pyc.

При этом интерпретатор выполняет следующие действия:

  • фиксирует время создания файла модуля (расширение *.py);
  • определяет время создания файла с байт-кодом (расширение *.pyc);
  • если время создания файла с байт-кодом (*.pyc) не старше файла модуля (*.py), то этап компиляции пропускается;
  • если файл с байт-кодом присутствует, а файл модуля отсутствует, то компилятор загрузит байт-код. Это означает, что можно распространять собственную программу в виде байт-кода и таким образом скрыть исходный код программы. В этом случае этап компиляции пропускается;
  • если в исходный файл модуля вносятся изменения, то при следующем запуске программы будет сформирован новый байт-код из этого модуля.

На рисунке 3 изображена схема выполненных действий интерпретатором на примере двух файлов main.py и myLib.py. Происходит получение байт-кода из модуля myLib.py, если требуется

Python. Модули. Инструкция import. Схема подключения

Рисунок 3. Схема выполнения действий интерпретатором при подключении файла инструкцией import

 

5. Запуск байт-кода модуля

Запуск байт-кода модуля является последним этапом операции импорта. Перед выполнением запуска уже сформирован байт-код модуля, размещенный в файле с расширением *.pyc. Инструкции, содержащиеся в модуле, выполняются одна за другой по принципу сверху-вниз. Для модуля создается объект. Атрибуты этого объекта создаются при выполнении какой-либо операции присваивания (=).

 


Связанные темы