Как загрузить модуль в python
Перейти к содержимому

Как загрузить модуль в python

  • автор:

Работа с модулями: создание, подключение инструкциями import и from

Python 3 логотип

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

Каждая программа может импортировать модуль и получить доступ к его классам, функциям и объектам. Нужно заметить, что модуль может быть написан не только на Python, а например, на C или C++.

Подключение модуля из стандартной библиотеки

Подключить модуль можно с помощью инструкции import. К примеру, подключим модуль os для получения текущей директории:

 import указывается название модуля. Одной инструкцией можно подключить несколько модулей, хотя этого не рекомендуется делать, так как это снижает читаемость кода. Импортируем модули time и random.
 
 

Использование псевдонимов

Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова as.

 

Инструкция from

Подключить определенные атрибуты модуля можно с помощью инструкции from. Она имеет несколько форматов:

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

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

Создание своего модуля на Python

Теперь пришло время создать свой модуль. Создадим файл mymodule.py, в которой определим какие-нибудь функции:

Теперь в этой же папке создадим другой файл, например, main.py:
Выведет:
Поздравляю! Вы сделали свой модуль! Напоследок отвечу ещё на пару вопросов, связанных с созданием модулей:

Как назвать модуль?

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

Куда поместить модуль?

Туда, где его потом можно будет найти. Пути поиска модулей указаны в переменной sys.path. В него включены текущая директория (то есть модуль можно оставить в папке с основной программой), а также директории, в которых установлен python. Кроме того, переменную sys.path можно изменять вручную, что позволяет положить модуль в любое удобное для вас место (главное, не забыть в главной программе модифицировать sys.path).

Можно ли использовать модуль как самостоятельную программу?

Можно. Однако надо помнить, что при импортировании модуля его код выполняется полностью, то есть, если программа что-то печатает, то при её импортировании это будет напечатано. Этого можно избежать, если проверять, запущен ли скрипт как программа, или импортирован. Это можно сделать с помощью переменной __name__, которая определена в любой программе, и равна "__main__", если скрипт запущен в качестве главной программы, и имя, если он импортирован. Например, mymodule.py может выглядеть вот так:

Для вставки кода на Python в комментарий заключайте его в теги

Установка модулей Python¶

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

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

В данном руководстве рассматривается часть процесса установки. Руководство по созданию и совместному использованию собственных проектов Python см. в руководстве по распространению .

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

Ключевые термины¶

  • pip является предпочтительной программой установки. Начиная с версии Python 3.4, он по умолчанию входит в состав Python бинарных установщиков.
  • виртуальная среда - это полуавтономная среда Python, которая позволяет устанавливать пакеты для использования определенным приложением, а не для установки в масштабах всей системы.
  • venv является стандартным инструментом для создания виртуальных сред и является частью Python начиная с Python 3.3. Начиная с версии Python 3.4, по умолчанию устанавливается pip во все созданные виртуальные среды.
  • virtualenv является сторонней альтернативой (и предшественником) venv . Он позволяет используемый виртуальные среды на версиях Python до 3.4, которые либо вообще не предоставляют venv , либо не могут автоматически устанавливать pip в созданные среды.
  • Пакетный индекс Python является публичным хранилищем лицензионных пакетов с открытым исходным кодом, доступных для использования другими пользователями Python.
  • Комитет по пакетам в Python является группой разработчиков и авторов документации, ответственных за обслуживание и развитие стандартных средств пакетизации и связанных с ними стандартов метаданных и форматов файлов. Они поддерживают различные инструменты, документацию и трекеры проблем как на GitHub, так и на Bitbucket.
  • distutils - это исходная система сборки и распространения, впервые добавленная в стандартную библиотеку Python в 1998 году. В то время как прямое использование distutils постепенно прекращается, оно по-прежнему закладывает основу для нынешней инфраструктуры пакетизации и распространения, и оно не только остается частью стандартной библиотеки, но и его название живет по-другому (например, название списка рассылки используемый для координации Python разработки стандартов пакетизации).

Изменено в версии 3.5: Теперь для создания виртуальных сред рекомендуется использовать venv .

Запускаемые модули и пакеты — Python: Настройка окружения

Представим, что у нас есть файл с кодом, который мы запускаем как скрипт. Файл разрастается, в нем появляются функции и прочие определения. В какой-то момент мы понимаем, что хотим переиспользовать функцию из этого модуля в другом модуле. Значит, нужно импортировать. В этом уроке мы разберемся, как работает импорт скриптов.

Импортирование скриптов

Смоделируем описанную выше ситуацию. Так будет выглядеть исходный скрипт:

# file def greet(who): print(f'Hello, who>!') greet('Bob') greet('Ann') 

Теперь посмотрим на новый скрипт, в котором мы хотим переиспользовать функцию greet из первого скрипта:

# file from first_script import greet greet('Thomas') 

Запустим первый скрипт, а затем — второй. Оба файла расположены в текущей директории:

При выполнении второго скрипта выполнился и первый, хотя мы всего лишь импортировали из него одну функцию — такова цена за простоту написания скриптов.

Файл первого скрипта содержит определения и непосредственные действия, поэтому при загрузке файла при импорте модуля эти действия будут выполнены.

Теперь представьте, что мы бы импортировали скрипт, в котором не просто что-то печатается на экран, а удаляются какие-то файлы.

Выходит, нам нужно как-то различать ситуации двух типов:

  1. Модуль работает как скрипт — выполняем побочные действия
  2. Модуль или его содержимое импортируются — не выполняем побочные действия

Специальная переменная __name__

Рассмотрим механизм импорта при загрузке модуля в первый раз — а именно первый для текущего запуска интерпретатора.

Во время первой загрузки интерпретатор добавляет в модуль несколько переменных специального вида. Этих переменных довольно много, но нам пока интересна одна — переменная __name__ .

Кажется, что у переменной необычное имя — в нем целых четыре символа подчеркивания. На самом деле такие имена часто встречаются в Python-коде и как правило имеют какой-то специальный смысл. Опытный разработчик обычно помнит наизусть пару десятков таких переменных, поэтому про эти переменные любят спрашивать на собеседованиях.

Посмотрим, что хранит переменная __name__ в каждом конкретном случае:

  • Если происходит обычный импорт, то эта переменная содержит полное имя модуля
  • Если происходит запуск в качестве скрипта, то переменная получает специальное значение — строку '__main__'

Глядя на значение этой переменной, мы можем отличать запуск в качестве скрипта от импортирования.

Слово main используется во многих языках для именования функции, которая вызывается автоматически при старте программы. Потому и в Python это слово используется в похожем смысле.

Давайте вернемся к нашему примеру и перепишем first_script.py с применением этого нового знания:

# file def greet(who): print(f'Hello, who>!') if __name__ == '__main__': greet('Bob') greet('Ann') 

Теперь наш скрипт не будет приветствовать Боба и Энн, если мы будем импортировать модуль.

Функция main

Наш скрипт first_script.py уже достаточно хорош, но можно немного его улучшить.

В теле условия if __name__… перечислен набор действий, которые выполняются при запуске скрипта. Со временем таких действий может стать достаточно много.

Нередко происходят ситуации, когда нужно переиспользовать этот кусок кода. Поэтому существует соглашение: в теле условия if __name__… делают всего один вызов функции без аргументов main , которую объявляют выше в этом же модуле. При этом само условие принято располагать в самом конце модуля скрипта.

С учетом всех описанных рекомендаций финальная версия скрипта first_script.py будет выглядеть так:

#!/usr/bin/env python3 def greet(who): print(f'Hello, who>!') def main(): greet('Bob') greet('Ann') if __name__ == '__main__': main() 

Такой скрипт можно:

  • Запускать непосредственно
  • Запускать из других скриптов, вызывая функцию main
  • Использовать как библиотеку

Запускаемые пакеты

Рассмотрим немного необычный, но все же встречающийся случай — запуск пакета.

Может показаться, что раз при загрузке пакета всегда загружается модуль __init__.py , то функцию main и условие нужно располагать в нем.

Но запуск пакетов реализован несколько иначе: при загрузке пакета интерпретатор ищет __main__.py и выполняет его как скрипт. Здесь мы не будем углубляться в причины — просто запомним, что исполняемые пакеты всегда содержат скрипт __main__.py .

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Как выложить свой модуль на PyPI

PyPI (Python Package Index) - это каталог модулей и библиотек для языка программирования Python, которые могут использовать все. Я думаю, все, кто программируют на Python, хотя бы раз устанавливали и использовали модули. Так вот, все пользовательские модули (т. е. те модули, которые вы устанавливаете, а не те, которые идут из-под коробки) выложены на PyPI.

Что нам нужно?

Чтобы выложить свой модуль на PyPI, нам понадобится:

  1. Ваш готовый модуль с правильной структурой файлов (об этом мы поговорим чуть позже).
  2. Аккаунт на PyPI (об этом мы также поговорим позже)
  3. Пакеты setuptools, wheel и twine (их можно установить через pip).
  4. Немного терпения.

Структура проекта

Для дальнейшей работы с модулем нам нужна правильная структура проекта. Вот пример такой структуры:

Структура файлов для модуля

Рассмотрим каждый файл по отдельности:

  • package-root - это корневая папка проекта.
  • package - это папка с исходным кодом модуля.
  • __init__.py - это обязательный файл, в котором должны быть прописаны все нужные вам импорты. Данный файл говорит, что именно эта папка является пакетом.
  • main.py - это просто пример файла, в котором должна быть написана основная логика модуля. Вы можете назвать его по-другому и, если надо, создать ещё сколько угодно файлов.
  • LICENSE - это файл лицензии на ваш проект. Можете использовать любую лицензию, главное, чтобы этот файл содержал текст выбранной вами лицензии.
  • README.md - это файл подробного описания модуля. Рекомендую помещать в него мини-документацию модуля.
  • setup.cfg - это конфигурационный файл для хранения настроек модуля. О том, что в нём писать, поговорим чуть позже.
  • setup.py - это главный установочный файл модуля. За счёт этого файла и будет происходить установка пакета. Что в нём писать, мы также рассмотрим чуть позже.

Регистрация на PyPI

Следующее, что вам нужно сделать - это зарегистрироваться на сайте pypi.org. Об этом я подробно писать не буду, там обычная регистрация.

Файлы setup.py и setup.cfg

Открываем файл setup.py и пишем в нём такой код:

from setuptools import setup, find_packages def readme(): with open('README.md', 'r') as f: return f.read() setup( name='package_name', version='1.0.0', author='your_nickname', author_email='example@gmail.com', description='This is my first module', long_description=readme(), long_description_content_type='text/markdown', url='home_link', packages=find_packages(), install_requires=['requests>=2.25.1'], classifiers=[ 'Programming Language :: Python :: 3.11', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent' ], keywords='example python', project_urls=< 'Documentation': 'link' >, python_requires='>=3.7' )

Давайте подробно рассмотрим написанный выше код. Первая строчка - это импортирование двух функций из библиотеки setuptools, которую вы должны были установить. Функция setup - это функция установки модуля, в которою передаются его параметры. Функция find_packages ищет все пакеты директории. На третьей строчке я написал функцию, которая читает весь текст из файла README.md. Это было сделано для удобства. На седьмой строчке вызываем функцию setup и передаём в неё некоторые параметры. Рассмотрим каждый параметр по отдельности:

  • name - имя пакета.
  • version - версия пакета. Если вы захотите обновить модуль, версия обязательно должна быть другой.
  • author - автор проекта. Можете написать там ваше имя или ваш никнейм (или что захотите).
  • author_email - ваша электронная почта (либо не ваша, как хотите).
  • description - короткое описание пакета.
  • long_description - подробное описание пакета. В данном случае содержимое файла README.md.
  • long_description_content_type - разметка, используемая в подробном описании. Здесь она указана как Markdown.
  • url - ссылка на домашнюю страницу пакета. Чаще всего, пишут ссылку на репозиторий проекта на GitHub.
  • packages - список пакетов, которые должны опубликоваться. Для удобства я использовал функцию find_packages.
  • install_requires - зависимости, которые будут установлены вместе с пакетом.
  • classifiers - метаданные о пакете.
  • keywords - ключевые слова (должны быть указаны через пробел).
  • project_urls - дополнительные ссылки пакета. В данном примере я указал только ссылку на документацию.
  • python_requires - требуемая версия Python.

Теперь открываем файл setup.cfg и пишем туда вот это:

[egg_info] tag_build = tag_date = 0

Так как в моём примере у пакета никаких особых настроек нет, можно задать только вот такие два параметра.

Публикация модуля

Наконец-то мы готовы опубликовать модуль на PyPI. Напомню, что у вас должны быть установлены библиотеки wheel и twine. И так, открываем любую консоль, переходим в корневую директорию проекта и пишем:

python setup.py sdist bdist_wheel

После выполнения данной команды в корневом каталоге должны появится несколько новых папок. Самая главная среди них - это папка dist, в ней находятся дистрибутивные файлы. Для загрузки модуля на test.pypi.org (это тот же PyPI, но для тестовой загрузки модуля, рекомендую сначала загружать туда, а потом на настоящий PyPI) пишем в консоли вот это:

twine upload --repository testpypi dist/*

После введения данной команды в консоли вас попросят ввести имя и пароль с TestPyPI. Если вы правильно ввели ваши данные, через некоторое время модуль будет загружен. А теперь надо выложить модуль на настоящий PyPI. Чтобы это сделать, вводим вот такую команду:

twine upload --repository pypi dist/*

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

Вот и всё! Вы выложили свой модуль на PyPI, теперь другие программисты могут его установить и пользоваться им. Спасибо за внимание, мне было приятно поделиться информацией 🙂

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *