Импорт модуля. Последовательность действий: поиск-компиляция-запуск. Список sys.path . Схема выполненных действий
Данная тема есть продолжением темы:
Поиск на других ресурсах:
1. Последовательность действий при выполнении импорта
Импорт модуля производится только один раз. Если повторно вызвать команду импорта модуля, она будет проигнорирована. При первом импорте другого модуля выполняются следующие операции времени выполнения:
- Находится файл модуля.
- Обнаруженный файл компилируется в байт-код, если это необходимо.
- Запускается программный код модуля. В результате создаются объекты, определенные в данном модуле.
2. Поиск модуля. Атрибут sys.path
При выполнении импорта первой операцией, выполняемой интерпретатором, является поиск местоположения файла модуля. В инструкции import расширения *.py не указывается, указывается только имя модуля. Также не указывается путь к каталогу, в котором имеется файл модуля.
Программирование ОВЕН ПЛК110. Часть 6. Подключение модулей ввода вывода
При написании программ, построенных с использованием модулей, в большинстве случаев не нужно настраивать путь к каталогам с используемыми модулями. Достаточно использовать автоматически настроенные пути поиска модулей, если размещать файлы этих модулей в одном каталоге с главным файлом (запускаемым файлом).
Если в программе используются модули других (сторонних) разработчиков структурированных в каталоги, то может возникнуть потребность в настройке этих пользовательских каталогов.
Для установки имен каталогов, которые должны использоваться в программе, используется атрибут path модуля sys . Модуль sys входит в состав стандартной библиотеки. Имена каталогов задаются в виде списка строк.
Рисунок 1. Просмотр содержимого файла sys.path командой File->Path Browser
При импорте модуля важно то, как отыскивается нужный каталог. Каталоги, следующие первыми в перечне, рассматриваются первыми. В любом случае поиск необходимого модуля осуществляется из следующих базовых источников, описывающих каталоги, в следующей последовательности:
- Текущий (домашний) каталог программы. Эта компонента определяется автоматически.
- Использование переменной окружения PYTHONPATH (если таковая определена). В этой переменной определен список имен каталогов с перечнем модулей, определенных пользователем и системой. Если переменная PYTHONPATH определена, то интерпретатор использует эту переменную для поиска путей к используемым модулям. Это случай, когда программисту (пользователю) необходимо импортировать модули, которые структурированы по каталогам (размещаются в разных каталогах).
- Использование каталогов стандартной библиотеки (см. п. 3). После выполнения пунктов 1, 2 производится поиск подключенных модулей в каталогах стандартной библиотеки. Эти каталоги автоматически подключаются интерпретатором, поэтому нет необходимости их настраивать вручную.
- Использование файла *.pth . В этом текстовом файле нужные каталоги задаются посредством списка строк.
Программирование ПЛК. 8. Подключение контроллера и первая программа.
Рисунок 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 color: #ff0000;»># 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 color: #ff0000;»># 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 color: #333300;»>⇑
4. Компиляция. Получение байт-кода модуля ( *.pyc ). Схема выполненных действий
После поиска модуля, заданного в инструкции import, происходит следующий этап – этап компиляции. На этом этапе интерпретатор компилирует файл модуля в байт-код, если это нужно. Файл с байт-кодом имеет расширение *.pyc .
При этом интерпретатор выполняет следующие действия:
- фиксирует время создания файла модуля (расширение *.py );
- определяет время создания файла с байт-кодом (расширение *.pyc );
- если время создания файла с байт-кодом ( *.pyc ) не старше файла модуля ( *.py ), то этап компиляции пропускается;
- если файл с байт-кодом присутствует, а файл модуля отсутствует, то компилятор загрузит байт-код. Это означает, что можно распространять собственную программу в виде байт-кода и таким образом скрыть исходный код программы. В этом случае этап компиляции пропускается;
- если в исходный файл модуля вносятся изменения, то при следующем запуске программы будет сформирован новый байт-код из этого модуля.
На рисунке 3 изображена схема выполненных действий интерпретатором на примере двух файлов main.py и myLib.py . Происходит получение байт-кода из модуля myLib.py , если требуется
Рисунок 3. Схема выполнения действий интерпретатором при подключении файла инструкцией import
5. Запуск байт-кода модуля
Запуск байт-кода модуля является последним этапом операции импорта. Перед выполнением запуска уже сформирован байт-код модуля, размещенный в файле с расширением *.pyc . Инструкции, содержащиеся в модуле, выполняются одна за другой по принципу сверху-вниз. Для модуля создается объект. Атрибуты этого объекта создаются при выполнении какой-либо операции присваивания ( = ).
Связанные темы
Источник: www.bestprog.net
Sysadminium
Из этой статьи вы узнаете что такое модули в Python, для чего они нужны и как с ними можно работать. Познакомимся с операторами import, from и as.
Оглавление скрыть
Что такое модули в Python
Модулем в Python 3 является любой файл с кодом. Модули можно импортировать в другие модули, это решает следующие задачи:
- Модуль можно использовать многократно. Например, вы можете написать свой модуль, который будете применять для написания других программ. Или вы можете использовать чужие модули Python, чтобы не реализовывать функциональность, которую уже реализовали другие программисты.
- Благодаря модулям можно разбить одну большую программу на несколько частей (модулей). И работать с ними по отдельности.
Импортирование модулей
Для импорта модуля используется два оператора:
- import — импорт модуля, при котором к объектам модуля (переменным, функциям и т.д.) можно обращаться через имя модуля;
- from — извлечение отдельных объектов из модуля, при этом к таким объектам можно будет обращаться напрямую.
Ниже разберём разницу на примерах.
Давайте напишем следующий модуль mod_1.py:
a = 15 my_str = «test_string» def hello(): print(«Hello World!»)
Оператор import
Теперь напишем основную программу, в которую импортируем наш модуль с помощью оператора import. А затем выполним функцию из модуля:
import mod_1 mod_1.hello() ### результат выполнения Hello World!
Важно положить файл основной программы и модуля в один каталог. Ниже я объясню где Python ищет файлы модулей.
Оператор from
Теперь импортируем наш модуль с помощью оператора from. Здесь после оператора from идёт имя модуля, а затем оператор import и имя импортируемого объекта:
from mod_1 import hello hello() ### результат выполнения Hello World!
Из примера видно, что мы обращаемся к функции hello() напрямую.
Кстати, чтобы импортировать все объекты с помощью from … import используется такая конструкция:
from mod_1 import * hello() print(a) ### результат выполнения Hello World! 15
Разница между import и from
В предыдущих примерах вы должны были увидеть разницу между import и from … import. Если используется import, вы должны обращаться к объектам модуля через точку (имя_модуля.имя_объекта).
А если используется from … import, то вы можете обращаться к объектам модуля напрямую.
Импортирование с помощью from … import * может показаться лучше, так как объекты из модуля становятся объектами программы, и к ним можно обращаться напрямую. Но если вы импортируете несколько модулей, а в них окажутся объекты с одинаковыми именами, то программа поломается, так как одни объекты перезапишут другие. Поэтому в таких случаях нужно использовать оператор import.
Например создадим ещё один модуль (mod_2.py), в нём также будет присутствовать переменная ‘a‘:
a = 20
И импортируем оба модуля в нашу программу:
import mod_1 import mod_2 print(mod_1.a) print(mod_2.a) ### результат выполнения 15 20
А теперь импортируем эти-же самые модули с помощью from … import *:
from mod_1 import * from mod_2 import * print(a) ### результат выполнения 20
Как видите, второй модуль переопределил значение переменной ‘a‘. Но ниже я покажу как это можно обойти.
Задание имени импортируемого модуля
Импортируемому модулю или объекту (если используется оператор from) можно задать имя с помощью оператора as, например:
import mod_1 as m m.hello() ### результат выполнения Hello World!
Кстати, это позволяет импортировать объекты с одинаковыми именами с помощью from, следующим образом:
from mod_1 import a as m1a from mod_2 import a as m2a print(m1a) print(m2a) ### результат выполнения 15 20
Не импортируемые переменные
В модуле можно использовать переменные начинающиеся на нижнее подчеркивание, эти переменные не будут импортированы в основную программу.
Например исправим наш второй модуль (mod_2.py):
_a = 20 _b = 30 def my_func(): return(_a + _b)
Импортируем этот модуль в программу и попробуем обратиться к переменным ‘_a‘ и ‘_b‘:
from mod_2 import * print(_a, _b) ### результат выполнения NameError: name ‘_a’ is not defined. Did you mean: ‘a’?
Зато функцию использовать мы сможем:
from mod_2 import * print(my_func()) ### результат выполнения 50
А вот импортирование с помощью import позволит обращаться к таким объектам:
import mod_2 print(mod_2._a) ### результат выполнения 20
Выполнение модулей
Когда мы импортируем модуль, то его код выполняется. Происходит выполнение в момент импорта. Например, исправим наш второй модуль (mod_2.py) таким образом:
print(«Запускает второй модуль») _a = 20 _b = 30 def my_func(): return(_a + _b)
А в основной программе просто импортируем этот модуль и больше ничего выполнять не будем:
import mod_2 ### результат выполнения Запускает второй модуль
Импортировать модули можно в разных местах основной программы, не обязательно в начале файла. Например можно выполнять импортирование в блоке if, в функции или в других местах вашей программы.
Атрибут модуля __name__
У каждого модуля есть атрибут __name__, который может принимать разные значения:
- Если модуль вызывается как программа верхнего уровня, то этот атрибут принимает значение __main__.
- А если этот модуль импортируется в другой модуль (в основную программу) то атрибут __name__ примет значение имени модуля.
Например, ещё раз изменим код второго модуля и выполним этот модуль:
if __name__ == ‘__main__’: print(«Запускаем модуль как программу») else: print(«Запускаем модуль как модуль») ### результат выполнения Запускаем модуль как программу
Теперь импортируем этот модуль в основную программу и выполним её:
import mod_2 ### результат выполнения Запускаем модуль как модуль
Обычно это применяется для тестирования модулей, когда требуется их отдельный запуск.
Встроенные модули и сторонние пакеты
Встроенные модули
В Python 3 есть множество встроенных модулей (built-in modules). Они написаны на языке C и интегрированы в интерпретатор Python. Чтобы посмотреть список встроенных модулей нужно воспользоваться одним из них — модулем sys.
Модуль sys предоставляет доступ к системным функциям и переменным.
Посмотрим с помощью него на список встроенные модулей:
import sys print(sys.builtin_module_names) ### результат выполнения (‘_abc’, ‘_ast’, ‘_bisect’, ‘_blake2’, ‘_codecs’, ‘_codecs_cn’, ‘_codecs_hk’, ‘_codecs_iso2022’, ‘_codecs_jp’, ‘_codecs_kr’, ‘_codecs_tw’, ‘_collections’, ‘_contextvars’, ‘_csv’, ‘_datetime’, ‘_functools’, ‘_heapq’, ‘_imp’, ‘_io’, ‘_json’, ‘_locale’, ‘_lsprof’, ‘_md5’, ‘_multibytecodec’, ‘_opcode’, ‘_operator’, ‘_pickle’, ‘_random’, ‘_sha1’, ‘_sha256’, ‘_sha3’, ‘_sha512’, ‘_signal’, ‘_sre’, ‘_stat’, ‘_statistics’, ‘_string’, ‘_struct’, ‘_symtable’, ‘_thread’, ‘_tokenize’, ‘_tracemalloc’, ‘_typing’, ‘_warnings’, ‘_weakref’, ‘_winapi’, ‘_xxsubinterpreters’, ‘array’, ‘atexit’, ‘audioop’, ‘binascii’, ‘builtins’, ‘cmath’, ‘errno’, ‘faulthandler’, ‘gc’, ‘itertools’, ‘marshal’, ‘math’, ‘mmap’, ‘msvcrt’, ‘nt’, ‘sys’, ‘time’, ‘winreg’, ‘xxsubtype’, ‘zlib’)
Также, с помощью этого модуля можно узнать много другой информации:
import sys print(«Версия Python — «, sys.version, ‘n’) print(«Модули при импорте ищутся в этих каталогах:», sys.path, ‘n’) print(«Кодировка — «, sys.getdefaultencoding(), ‘n’) print(«Платформа: «, sys.platform, ‘n’) ### результат выполнения Версия Python — 3.11.1 (tags/v3.11.1:a7a450f, Dec 6 2022, 19:58:39) [MSC v.1934 64 bit (AMD64)] Модули при импорте ищутся в этих каталогах: [‘c:\Users\User\Documents\python’, ‘C:\Users\User\AppData\Local\Programs\Python\Python311\python311.zip’, ‘C:\Users\User\AppData\Local\Programs\Python\Python311\Lib’, ‘C:\Users\User\AppData\Local\Programs\Python\Python311\DLLs’, ‘C:\Users\User\AppData\Roaming\Python\Python311\site-packages’, ‘C:\Users\User\AppData\Roaming\Python\Python311\site-packages\win32’, ‘C:\Users\User\AppData\Roaming\Python\Python311\site-packages\win32\lib’, ‘C:\Users\User\AppData\Roaming\Python\Python311\site-packages\Pythonwin’, ‘C:\Users\User\AppData\Local\Programs\Python\Python311’, ‘C:\Users\User\AppData\Local\Programs\Python\Python311\Lib\site-packages’] Кодировка — utf-8 Платформа: win32
Модули при импорте ищутся вначале в каталоге программы (у меня это — c:UsersUserDocumentspython), затем в следующих каталогах, перечисленных в sys.path. Ну а встроенные модули — встроены в интерпретатор.
Ниже я рассмотрю ещё несколько встроенных модулей.
Модуль math — содержит множество математический функций, например:
import math print(math.factorial(5)) # Факториал print(math.fmod(16, 3)) # Остаток от деления print(math.log10(1000) ) # Логарифм 1000 по основанию 10 print(math.log2(8)) # Логарифм 4 по основанию 2 print(math.sqrt(16)) # Квадратный корень из 16 ### результат выполнения 120 1.0 3.0 3.0 4.0
Модуль os — позволяет работать с операционной системой:
import os print(os.getcwd()) # Текущая директория print(os.listdir(path=».»)) # Список файлов в директории print(os.getlogin()) # Имя пользователя print(os.getpid() ) # Текущий pid процесса
Сторонние пакеты
Также в систему можно установить дополнительные модули с помощью утилиты командной строки pip, для этого в командной строке нужно выполнить:
pip install
Пакет — это каталог с модулями для решения определённой задачи.
На windows скорее всего эти пакеты будут скачаны в каталог:
C:Users\AppDataLocalProgramsPythonPythonLibsite-packages
Получить список всех модулей (встроенных и установленных) можно таким образом:
help(‘modules’) ### результат выполнения IPython backcall mmsystem telebot __future__ base64 mod_1 telebot_router __hello__ bdb mod_2 telnetlib __phello__ binascii modulefinder tempfile _abc bisect msilib test _aix_support builtins msvcrt test2 _ast bz2 multiprocessing textwrap _asyncio cProfile nest_asyncio this _bisect calendar netbios threading _blake2 certifi netrc time _bootsubprocess cgi nntplib timeit _bz2 cgitb nt timer _codecs charset_normalizer ntpath tkinter ### вывод сократил, так как он очень большой
Я, например, использовал следующие пакеты:
- proxmoxer — для работы с proxmox кластером;
- requests — для http запросов (требуется для proxmoxer);
- telebot — для написания ботов для telegram;
- psycopg2 — для работы с PostgreSQL.
А вообще таких модулей бесчисленное множество, одни позволяют создавать сайты, другие облегчают работу по созданию нейросетей, третьи позволяют создавать десктопные приложения, четвертые позволяют подключаться к базам данных и так далее.
Вы и сами можете создать папку для написания своих модулей, а затем импортировать эти модули таким образом:
import .
Итог
После прочтения этой статьи вы должны лучше понимать зачем нужны модули в Python 3. А также должны уметь создавать свои модули, устанавливать сторонние модули и использовать встроенные модули.
Я описал работу трёх операторов: import, from, as. Рассказал про не-импортируемые объекты, имена которых начинаются на нижнее подчеркивание, и про атрибут __name__.
Другие статьи по python 3 можете посмотреть здесь.
Документацию про модули (на английском языке) читайте здесь.
Имя статьи
Python 3. Модули
В этой статье узнаем что такое модули в Python, для чего они нужны и как с ними можно работать. Познакомимся с операторами import, from и as
Источник: sysadminium.ru
Подключение модулей в Python
В любом языке программирования (ну по крайне мере в языке программирования высокого уровня) имеются так называемые “стандартные” функции, процедуры, типы данных, константы и т.п., и, если хотите, “нестандартные”, которые, однако, можно использовать. Но находятся они либо в отдельных модулях, либо в библиотеках.
Сделано это для того, чтобы не раздувать размер основного модуля. Кроме того, функции удобно группировать, и, например, математические функции обычно помещаются в модуль с именем math или подобным.
Однако, прежде чем использовать функции какого-либо модуля (кроме основного), его надо подключить к вашей программе. В разных языках это делается по разному, но в Python это делается так:
То есть мы используем ключевое (зарезервированное) слово import , затем через пробел указываем имя модуля, который надо подключить к программе. После этого (если всё пройдёт без ошибок) можно использовать функций, объекты, переменные, константы и т.п. этого модуля. Чтобы получить доступ к функции (или другому элементу) модуля, надо указать имя модуля и имя функции, разделённые точкой. Это отличается, например, от Паскаля. Потому что в Паскале модуль — это просто кусок кода, а в Python и некоторых других языках по сути модуль превращается в объект.
Пример подключения модуля и его использования:
Здесь мы подключили модуль math и получили значение числа е — константы, которая объявлена в модуле math .
В Python есть некоторое количество встроенных модулей. Например, math является встроенным модулем:
Вы можете это проверить, подключив модуль, напечатав его имя и нажав ENTER. Получите то, что на рисунке выше — сообщение:
module ‘math’ (built-in)
built-in переводится как “встроенный”.
Однако используя лишь встроенные модули, вы далеко не уедете. Потому что вся мощь Python обеспечивается “внешними” модулями, большинство из которых разрабатываются самими программистами из сообщества Python или вообще одиночками-фанатиками.
Внешний модуль вы не сможете просто так подключить, потому что Python ничего о нём не знает. Для него это всё равно, что какое-то неизвестное слово. И вы, даже если точно знаете, что где-то существует модуль с именем mybestunit , при попытке подключить его получите сообщение об ошибке:
Не встроенный модуль перед подключением надо установить. Делается это через командную строку, и это будет описано в отдельной статье. Но если такой модуль у вас уже установлен, то вы можете также напечатать его имя и нажать ENTER. И получите примерно следующее:
То есть здесь уже понятно, что это не встроенный модуль. Вам сообщают, что модуль загружен из определённого места, куда сначала его надо установить.
На этом пока всё. Подписывайтесь на новости, чтобы ничего не пропустить (ссылки внизу).
Источник: info-master.su