Импорт модуля. Последовательность действий: поиск-компиляция-запуск. Список sys.path. Схема выполненных действий
Данная тема есть продолжением темы:
Содержание
- 1. Последовательность действий при выполнении импорта
- 2. Поиск модуля. Атрибут sys.path
- 3. Использование модулей стандартной библиотеки Python. Пример
- 4. Компиляция. Получение байт-кода модуля (*.pyc). Схема выполненных действий
- 5. Запуск байт-кода модуля
- Связанные темы
Поиск на других ресурсах:
1. Последовательность действий при выполнении импорта
Импорт модуля производится только один раз. Если повторно вызвать команду импорта модуля, она будет проигнорирована. При первом импорте другого модуля выполняются следующие операции времени выполнения:
- Находится файл модуля.
- Обнаруженный файл компилируется в байт-код, если это необходимо.
- Запускается программный код модуля. В результате создаются объекты, определенные в данном модуле.
⇑
2. Поиск модуля. Атрибут sys.path
При выполнении импорта первой операцией, выполняемой интерпретатором, является поиск местоположения файла модуля. В инструкции import расширения *.py не указывается, указывается только имя модуля. Также не указывается путь к каталогу, в котором имеется файл модуля.
При написании программ, построенных с использованием модулей, в большинстве случаев не нужно настраивать путь к каталогам с используемыми модулями. Достаточно использовать автоматически настроенные пути поиска модулей, если размещать файлы этих модулей в одном каталоге с главным файлом (запускаемым файлом).
Если в программе используются модули других (сторонних) разработчиков структурированных в каталоги, то может возникнуть потребность в настройке этих пользовательских каталогов.
Для установки имен каталогов, которые должны использоваться в программе, используется атрибут path модуля sys. Модуль sys входит в состав стандартной библиотеки. Имена каталогов задаются в виде списка строк.
Рисунок 1. Просмотр содержимого файла sys.path командой File->Path Browser
При импорте модуля важно то, как отыскивается нужный каталог. Каталоги, следующие первыми в перечне, рассматриваются первыми. В любом случае поиск необходимого модуля осуществляется из следующих базовых источников, описывающих каталоги, в следующей последовательности:
- Текущий (домашний) каталог программы. Эта компонента определяется автоматически.
- Использование переменной окружения PYTHONPATH (если таковая определена). В этой переменной определен список имен каталогов с перечнем модулей, определенных пользователем и системой. Если переменная PYTHONPATH определена, то интерпретатор использует эту переменную для поиска путей к используемым модулям. Это случай, когда программисту (пользователю) необходимо импортировать модули, которые структурированы по каталогам (размещаются в разных каталогах).
- Использование каталогов стандартной библиотеки (см. п. 3). После выполнения пунктов 1, 2 производится поиск подключенных модулей в каталогах стандартной библиотеки. Эти каталоги автоматически подключаются интерпретатором, поэтому нет необходимости их настраивать вручную.
- Использование файла *.pth. В этом текстовом файле нужные каталоги задаются посредством списка строк.
Рисунок 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, если требуется
Рисунок 3. Схема выполнения действий интерпретатором при подключении файла инструкцией import
⇑
5. Запуск байт-кода модуля
Запуск байт-кода модуля является последним этапом операции импорта. Перед выполнением запуска уже сформирован байт-код модуля, размещенный в файле с расширением *.pyc. Инструкции, содержащиеся в модуле, выполняются одна за другой по принципу сверху-вниз. Для модуля создается объект. Атрибуты этого объекта создаются при выполнении какой-либо операции присваивания (=).
⇑
Связанные темы
⇑