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. Інструкції, що є в модулі, виконуються одна за одною за принципом зверху-вниз. Для модуля створюється об’єкт. Атрибути цього об’єкту створюються при виконанні будь-якої операції присвоєння (=).

 


Споріднені теми