Как сделать из обычной папки python package

Добавил пользователь Morpheus
Обновлено: 04.10.2024

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

В статье я покажу вам, как опубликовать пакет Python в сервисе PyPi (Python Package Index). Именно отсюда pip загружает их для использования в проектах и инструментах командной строки, которые вы можете применить на компьютере.

1. Создание проекта

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

Создадим новую структуру каталогов для нашего проекта:

sample-pypi-package
└── hello_world
├── __init__.py
└── main.py

sample-pypi-package — это корневой уровень проекта, и мы создаем модуль hello_world внутри него. Содержание __init__.py пусто и main.py выглядит так:

def hello_world():
print("Hello World")

Для первого шага все. Ничего необычного, если вы знакомы с Python. main.py не нужен для этого урока, но я добавил его просто для того, чтобы у нас был файл внутри модуля.

2. Файл setup.py

Мы создадим новый setup.py, который действует как скрипт сборки для нашего пакета. Однако нужно будет установить setuptools через pip. Вы можете выполнить приведенную ниже команду. Помните, какая версия Python у вас, и используйте соответствующий pip.

pip install setuptools
ИЛИ
pip3 install setuptools

Теперь, когда мы установили setuptools, мы можем начать настраивать setup.py:

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

Две строки, которые я хочу выделить:

Я специально прокомментировал их, потому что они не нужны в этом упражнении, однако они важны, если ваш пакет имеет зависимости. Реальный проект будет иметь внешние зависимости, поэтому именно так вы добавляете их в дистрибутив, чтобы пользователь, устанавливающий ваш пакет, получил необходимое для корректной работы. Типичная практика — создание файла requirements.txt, который setup.py может читать вместо определения массива.

Если вам интересно узнать обо всех параметрах setuptools.setup() смотрите официальную документацию .

3. Файлы README.md и LICENSE

Эта часть не так увлекательна, но очень важна. Поскольку вы публикуете в мир, надо убедиться, что у вас есть соответствующая документация, а также надлежащая лицензия с открытым исходным кодом. Мы также нуждаемся в README.md поскольку используем его внутри setup.py.

Создадим простой README.md на корневом уровне проекта:

This is a simple exercise to publish a package onto PyPi.

Продолжим и создадим файл LICENSE на корневом уровне с лицензией MIT:

Обязательно измените [year] и [fullname]!

Теперь, когда у нас есть LICENSE и README.md, структура каталогов должна выглядеть так:

4. Создание дистрибутивных файлов

Итак, теперь, когда пакет полностью установлен, можно генерировать дистрибутивные файлы. Это файлы, которые пользователь будет загружать и распаковывать, чтобы запустить код. Поэтому, когда вы выполните pip install с указанием пакета, то загрузите tarball/zip для распаковки на компьютере локально.

Нам понадобится еще один инструмент:

pip install wheel
ИЛИ
pip3 install wheel

После загрузки wheel мы можем применить его для создания файлов.

Выполните эти команды в том же каталоге, где находится setup.py (это корневой каталог, если вы следуете руководству):

python setup.py sdist bdist_wheel
ИЛИ
python3 setup.py sdist bdist_wheel

Терминал должен отобразить логи того, что он делает. У вас должно быть создано несколько новых каталогов, которые я выделил жирным шрифтом ниже. Загружать их в репозиторий я не буду.

Оба build и hello_world_ericjaychi.egg-info можно проигнорировать. Сосредоточимся на каталоге dist:

dist/
├── hello_world_ericjaychi-0.0.1-py3-none-any.whl
└── hello_world_ericjaychi-0.0.1.tar.gz

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

5. Загрузка дистрибутивных файлов

Пришло время загрузить эти файлы в PyPi. Прежде чем мы это сделаем, нужно сначала создать там учетную запись. Одна деталь: PyPi предлагает тестовую среду для публикации пакетов, так что вы можете поиграть с этим процессом перед публикацией по-настоящему. Я предоставлю обе регистрационные формы. Также я рекомендовал бы поработать с тестовым сайтом, прежде чем публиковать на живой сервер.

Приведу примеры публикации в обеих средах.

После регистрации пришло время установить последний инструмент:

pip install twine
ИЛИ
pip3 install twine

Как только twine установится, можно использовать его для загрузки пакета в PyPi. Выполните эту команду на корневом уровне проекта:

twine upload --repository testpypi dist/* (TEST)
twine upload --repository pypi dist/* (PROD)

Если они не работают, поместите перед ними python или python3.

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

Модули и пакеты являются неотъемлемой частью модульного программирования - организации программы как совокупности небольших независимых блоков, структура и поведение которых подчиняются определенным правилам.

Разработка программы как совокупности модулей позволяет:

упростить задачи проектирования программы и распределения процесса разработки между группами разработчиков;

предоставить возможность обновления (замены) модуля, без необходимости изменения остальной системы;

упростить тестирование программы;

упростить обнаружение ошибок.

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

9.1.1. Основные понятия¶

Модуль (англ. Module) - специальное средство языка программирования, позволяющее объединить вместе данные и функции и использовать их как одну функционально-законченную единицу (например, математический модуль, содержащий тригонометрические и прочие функции, константы \(\pi\) , \(\epsilon\) и т.д.).

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

9.1.2. Модули и пакеты в Python¶

Модуль - отдельный файл с кодом на Python, содержащий функции и данные:

имеет расширение *.py (имя файла является именем модуля);

может быть импортирован (подключен) (директива import . );

может быть многократно использован.

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

Так, например, пакет xml имеет следующую структуру:

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

Одна из основных целей использования как модулей, так и пакетов - реализация модели пространства имен, позволяющей логически группировать и в то же время изолировать различные идентификаторы. Например, при наличии глобальной переменной author в модуле A и B не произойдет конфликта, т.к. они находятся в разном пространстве имен: A.author и B.author соответственно.

9.1.2.1. Классификация¶

Все модули/пакеты в Python можно разделить на 4 категории:

Встроенные (англ. Built-in).

Модули, встроенные в язык и предоставляющие базовые возможности языка (написаны на языке Си).

К встроенным относятся как модули общего назначения (например, math или random ), так и плаиформозависимые модули (например, модуль winreg , предназначенный для работы с реестром ОС Windows, устанавливается только на соответствующей ОС).

Список установленных встроенных модулей можно посмотреть следующим образом:

Стандартная библиотека (англ. Standard Library).

Модули и пакеты, написанные на Python, предоставляющие расширенные возможности, например, json или os .

Сторонние (англ. 3rd Party).

Модули и пакеты, которые не входят в дистрибутив Python, и могут быть установлены из каталога пакетов Python (англ. PyPI - the Python Package Index, более 90.000 пакетов) с помощью утилиты pip :

При установке пакета автоматически устанавливаются зависимые пакеты.

Модули и пакеты, создаваемые разработчиком.

Примечание

Создание собственных пакетов не рассматривается в рамках настоящего курса.

В собственной программе рекомендуется выполнять импорт именно в таком порядке: от встроенных до собственных модулей/пакетов.

9.1.2.2. Подключение и использование¶

Для использования модуля или пакета в коде необходимо его предварительно подключить (импортировать).

Импорт модуля или пакета выполняется единожды инструкцией import , располагаемой, как правило, в начале файла.

Выполнить подключение модуля можно несколькими способами:

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

Различные варианты подключения модуля и пакета приведены в Листингах 9.1.1 (а-г).

Модулем python может быть любой программный файл python, который содержит код, включая функции, класс или переменные python. Другими словами, мы можем сказать, что файл кода Python, сохраненный с расширением(.py), рассматривается как модуль. У нас может быть исполняемый код внутри модуля python.

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

Необходимо включить этот модуль в наш основной модуль, чтобы вызвать метод displayMsg(), определенный в модуле с именем file.

Загрузка модуля в код Python

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

  1. Оператор импорта
  2. Оператор from-import

Оператор импорта

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

Мы можем импортировать несколько модулей с помощью одного оператора импорта, но модуль загружается один раз, независимо от того, сколько раз он был импортирован в наш файл.

Синтаксис для использования оператора импорта приведен ниже.

Следовательно, если нам нужно вызвать функцию displayMsg(), определенную в файле file.py, мы должны импортировать этот файл как модуль в наш модуль, как показано в примере ниже.

Оператор from-import

Вместо того, чтобы импортировать весь модуль, в python имеется возможность импортировать только определенные атрибутов модуля. Это можно сделать с помощью from-import оператора. Синтаксис для использования оператора from-import приведен ниже.

Рассмотрим следующий модуль, называемый calculation, который содержит три функции: суммирование, умножение и деление.

Оператор from … import всегда лучше использовать, если мы заранее знаем атрибуты, которые нужно импортировать из модуля. Это не позволяет нашему коду быть тяжелее. Мы также можем импортировать все атрибуты из модуля, используя *.

Рассмотрим следующий синтаксис.

Переименование модуля

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

Синтаксис для переименования модуля приведен ниже.

Использование функции dir()

Функция dir() возвращает отсортированный список имен, определенных в переданном модуле. Этот список содержит все подмодули, переменные и функции, определенные в этом модуле.

Рассмотрим следующий пример.

Функция reload()

Как мы уже говорили, модуль загружается один раз независимо от того, сколько раз он был импортирован в исходный файл python. Однако, если вы хотите перезагрузить уже импортированный модуль, чтобы повторно выполнить код верхнего уровня, python предоставляет нам функцию reload(). Синтаксис использования функции reload() приведен ниже.

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

Объем переменных

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

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

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

Рассмотрим следующий пример.

Пакеты Python

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

1. Создайте каталог с именем Сотрудники / home.

2. Создайте исходный файл python с именем ITEmployees.py / home / Employees.

3. Аналогичным образом создайте еще один файл python с именем BPOEmployees.py и функцию getBPONames().

6. Чтобы использовать модули, определенные внутри пакета Employees, мы должны импортировать их в наш исходный файл python. Давайте создадим простой исходный файл Python в нашем домашнем каталоге(/ home), который использует модули, определенные в этом пакете.

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

На следующем изображении показана структура каталогов системы управления библиотекой приложений, которая содержит три подпакета: Admin, Librarian и Student. Подпакеты содержат модули Python.

Python

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

В статье я покажу вам, как опубликовать пакет Python в сервисе PyPi (Python Package Index). Именно отсюда pip загружает их для использования в проектах и инструментах командной строки, которые вы можете применить на компьютере.

1. Создание проекта

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

Создадим новую структуру каталогов для нашего проекта:

sample-pypi-package — это корневой уровень проекта, и мы создаем модуль hello_world внутри него. Содержание __init__.py пусто и main.py выглядит так:

Для первого шага все. Ничего необычного, если вы знакомы с Python. main.py не нужен для этого урока, но я добавил его просто для того, чтобы у нас был файл внутри модуля.

2. Файл setup.py

Мы создадим новый setup.py , который действует как скрипт сборки для нашего пакета. Однако нужно будет установить setuptools через pip . Вы можете выполнить приведенную ниже команду. Помните, какая версия Python у вас, и используйте соответствующий pip .

Теперь, когда мы установили setuptools , мы можем начать настраивать setup.py :

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

Две строки, которые я хочу выделить:

Я специально прокомментировал их, потому что они не нужны в этом упражнении, однако они важны, если ваш пакет имеет зависимости. Реальный проект будет иметь внешние зависимости, поэтому именно так вы добавляете их в дистрибутив, чтобы пользователь, устанавливающий ваш пакет, получил необходимое для корректной работы. Типичная практика — создание файла requirements.txt , который setup.py может читать вместо определения массива.

Если вам интересно узнать обо всех параметрах setuptools.setup() смотрите официальную документацию.

3. Файлы README.md и LICENSE

Эта часть не так увлекательна, но очень важна. Поскольку вы публикуете в мир, надо убедиться, что у вас есть соответствующая документация, а также надлежащая лицензия с открытым исходным кодом. Мы также нуждаемся в README.md поскольку используем его внутри setup.py .

Создадим простой README.md на корневом уровне проекта:

Продолжим и создадим файл LICENSE на корневом уровне с лицензией MIT:

Обязательно измените [year] и [fullname] !

Теперь, когда у нас есть LICENSE и README.md , структура каталогов должна выглядеть так:

4. Создание дистрибутивных файлов

Итак, теперь, когда пакет полностью установлен, можно генерировать дистрибутивные файлы. Это файлы, которые пользователь будет загружать и распаковывать, чтобы запустить код. Поэтому, когда вы выполните pip install с указанием пакета, то загрузите tarball/zip для распаковки на компьютере локально.

Нам понадобится еще один инструмент:

После загрузки wheel мы можем применить его для создания файлов.

Выполните эти команды в том же каталоге, где находится setup.py (это корневой каталог, если вы следуете руководству):

Терминал должен отобразить логи того, что он делает. У вас должно быть создано несколько новых каталогов, которые я выделил жирным шрифтом ниже. Загружать их в репозиторий я не буду.

Оба build и hello_world_ericjaychi.egg-info можно проигнорировать. Сосредоточимся на каталоге dist :

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

5. Загрузка дистрибутивных файлов

Пришло время загрузить эти файлы в PyPi. Прежде чем мы это сделаем, нужно сначала создать там учетную запись. Одна деталь: PyPi предлагает тестовую среду для публикации пакетов, так что вы можете поиграть с этим процессом перед публикацией по-настоящему. Я предоставлю обе регистрационные формы. Также я рекомендовал бы поработать с тестовым сайтом, прежде чем публиковать на живой сервер.

Приведу примеры публикации в обеих средах.

После регистрации пришло время установить последний инструмент:

Как только twine установится, можно использовать его для загрузки пакета в PyPi. Выполните эту команду на корневом уровне проекта:

Если они не работают, поместите перед ними python или python3 .

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

Image for post

Загрузка завершена!

Он даже даст вам ссылку в конце, чтобы показать, что пакет был опубликован для конкретной версии. Вот ссылки, которые были сгенерированы во время этого упражнения, представляющие TEST и PROD соответственно:

Image for post

Ура!

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

Откройте интерпретатор Python и импортируйте модуль hello_world , созданный в этой статье.

Image for post

Ошибок нет!

Наш интерпретатор должен распознать импорт без каких-либо проблем.

Вывод

Поздравляю! Вы успешно опубликовали пакет Python в PyPi.

PyPi — это потрясающая платформа, которая позволяет сообществу Python с легкостью распространять код среди других пользователей по всему миру.

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

Читайте также: