О чём статья и почему она существует
Эту статью я пишу для тех, кто только-только начал или хочет опубликовать свой пакет на PyPI. Когда я впервые попробовал опубликовать PyPI-пакет по официальному гайду самостоятельно, у меня самого возникло очень много вопросов по тому зачем и почему.
А ещё, мне показалось, что для новичка эта статья немного перегружена и было бы не плохо разделить её на две части:
- Быстрый старт с минимально-необходимыми действиями.
- Полное и углублённое руководство уже для тех кто в теме. (В разработке)
Так же хочу заметить, что я буду писать про новый (современный) подход в публикации пакетов, а именно через конфигурационный файл pyproject.toml, где будут представлены все необходимые конфигурации для упаковки вашего кода.
Вступление
Для чего вообще заниматься этой упаковкой, кому это нужно и что такое PyPI? Давай начнём с начала.
Весь этот переход был совершён относительно недавно - 2016 год. Когда вышел PEP 518 - тогда и появился единый, стандартный способ публикации и упаковки пакетов через pyproject.toml.
Для кого это вообще нужно? Ну вообще, для разработчиков, тестировщиков и других ребят, которые так или иначе связаны с Python. Чтобы облегчить им жизнь и стандартизировать процесс деплоя всех пакетов на PyPI.
Хорошо, а зачем нам PyPI? Почему бы не использовать тот же GitHub, или Bitbucket для хранения исходного кода? На эти вопросы можно дать различные ответы в зависимости от того, с какой стороны посмотреть. Так например, Python очень отличен от тех же самых C++ или JS. C++, вообще не имеет официального индекса библиотек и пакетов как Python. У JS он есть - Node Package Manager (NPM).
Так вот, работают эти языки совершенно на разных уровнях и по разным правилам. И если хочется, чтобы можно было легко и быстро установить необходимый тебе функционал - в одну команду, то необходим некий центральных хаб со своими определёнными правилами и требованиями к структуре и работе пакетов.
Так например, если хочется создавать web-приложения или целый сайт, просто установи django, и ты готов:
Пример установки пакета из PyPI
Или если ты хочешь добавить поддержку HTMx-библиотеки для своих шаблонов(html-страниц), просто установи соответствующий node-модуль:
Пример установки пакета из NPM
Сравните это с установкой библиотек для C++. Мало того, что ты должен найти подходящую библиотеку, ты должен будешь ещё подключить заголовки (в нужных тебе местах), плюс сделать линковку (динамическую или статическую). Да, конечно, есть CMake, есть Make, есть ещё большая куча различных систем сборок - но отсутствует единый (официальный) хаб для всех возможных библиотек.
Вот почему нужен PyPI, и почему он нужен именно стандартизированный. Это просто делает жизнь проще.
Настраиваем необходимый минимум
Для того чтобы создать собственный пакет для PyPI, необходимо будет установить pip и python соответственно. Так же нужно будет создать виртуальное окружение как для создаваемого нами пакета для PyPI, так и для проекта, где мы будем использовать наш пакет.
Шаги, которые необходимо пройти:
- С официального сайта, устанавливаем python - https://www.python.org/downloads/. Вместе с python будет установлен и pip
- Создаём директорию и виртуальное окружение, где будем создавать пакет. Для этого назовём директорию UsefulPackage.
- Регистрируемся на pypi.org (и на test.pypi.org, если только начинаешь и нужно освоиться)
Кто не знает как создать виртуальное окружение, это делается через следующую команду, где:
- python - имя версии питона, для которой ты хочешь собрать виртуальное окружение
- -m venv - имя используемого модуля, в данном случае этот модуль для создания виртуального окружения
- .venv - позиционный аргумент модуля виртуального окружения, говорит в какую директорию сохранить виртуальное окружение
Это всё что нам потребуется для дальнейшего. Итак, на данный момент, структура пакета у нас следующая:
- UsefulPackage
- .venv
Дополнительно, тестовый проект
Дополнительно можно создать тестовый проект, куда и будем устанавливать недавно созданный пакет, для того чтобы просто убедиться, что мы всё сделали правильно и пакет действительно работает как надо. Для этого создадим директорию UsefulProgram. И там создадим виртуальное окружение, как это было описанно выше.
Нам ещё потребуется файл main.py, который мы и будем пропускать через интерпретатор.
Создай его и вставь следующий тестовый код:
Вместо YOURNAME, нужно будет подставить собственное имя или любую другую строку. Это необходимо будет для того, чтобы каждый смог создать свой собственный пакет и не было конфликтов интересов. В качестве альтернативы, можешь придумать собственное название пакета и использовать его.
Это всё что нам потребуется для дальнейшего. Итак, на данный момент, структура проекта у нас следующая:
- UsefulProgram
- .venv
- main.py
Если запустить его сейчас, то ты получишь ошибку не правильного импорта пакетов, такого пакета пока не существует.

Быстрый старт, по созданию базового пакета на Python для PyPI
Эта глава попытается провести тебя через основные шаги к публикации твоего первого пакета на PyPI. А я постараюсь рассказать про все нюансы и особенности наших действий, по ходу создания пакета.
Создаём минимально необходимую структуру проекта
И для начала потребуется создать соответствующую структуру для пакета. Она будет выглядеть вот так:
- UsefulPackage/
- .venv/
- useful_package_timthewebmaster/
- LICENSE <- Файл лицензии можно выбрать подходящую тут
- pyproject.toml <- О нём поговорим чуть ниже, файл конфигурации
- dist/ <- Место где будет source distribution и build distribution
- src/
- useful_package_timthewebmaster/ <- Место где будет исходный код вашего пакета и его логика соответственно
- __init__.py
- main.py
В src/useful_package_timthewebmaster будут находиться наши скрипты, которые мы и хотим использовать в других проектах.
Настраиваем файл pyproject.toml
После создания структуры для пакета, необходимо прописать конфигурационный файл - pyproject.toml. Данный файл имеет всего лишь 4 обязательных параметра.
Так, в [build-system] секции мы указываем какой бэкенд (и версию ) использовать для сборки пакета. А в секции [project] мы задаём всего лишь 2 обязательных поля: имя пакета и его версию. Все остальные поля не обязательны.
Хоть и вверху минимально-дозволенный файл конфигурации для создания пакета, я настоятельно рекомендую ознакомиться и с другими полями для настроек. Плюс, все возможные класификаторы, они помогут определить нишу твоего пакета и найти, соответственно, нужных пользователей.
Я обычно отталкиваюсь от этого базового шаблона, созданного мной и для меня. И просто меняю отличающиеся поля:
На примере одного из моих пакетов
Генерируем python-пакет
У нас есть всё необходимое, чтобы построить свой первый пакет. Но для начала установим модель для интерпретатора python в текущем виртуальном окружении (незабудь пожалуйста создать его и активировать):
Заходим в директорию с файлом настроек python-пакета, т.е. pyproject.toml и запускаем процесс создания пакета:
И вот так будет выглядеть, результат работы модуля build. Ну а если конкретнее, то будут созданы два архива source distribution и build distribution:

У нас появятся следующие архивы: useful_package_timthewebmaster-0.0.1-py2.py3-none-any.whl и useful_package_timthewebmaster-0.0.1.tar.gz, которые уже можно отправить в индекс PyPI.
Загружаем пакет на PyPI
Для того, чтобы их отправить потребуется установть ещё один модуль, модуль twine (не забудь создать и активировать виртуальное окружение).
Если ты всё ещё работаешь с тестовым репозиторием то, чтобы отправить пакет на тестовый индекс необходимо его указать используя флаг --repository с аргументом testpypi. А в конце указать все архивы, которые хочешь отправить.
В моём случае я отпрвлю все архивы в директории dist
Ну а если тебе уже не надо тестить методы и способы публикации своих пакетов, то публикация пакета в открытый индекс выглядит так:
На этом этапе от тебя потребуют API-токен для подтверждения того, кто и куда хочет опубликовать свой пакет. Его нужно будет создать. И есть небольшой нюанс, у каждого токена есть область действия, так сказать. Можно указать область действия для всех пакетов, а можно выборочно для каждого.
Чтобы создать токен для тестового индекса тебе сюда https://test.pypi.org/manage/account/#api-tokens
Чтобы создать токен для публичного индекса тебе сюда https://pypi.org/manage/account/#api-tokens
Вот так будет выглядеть результат успешной публикации пакета в индекс PyPI (вне зависимости от того тестовые это сервера или нет):

Поздравляю, ты успешно опубликовал свой первый python-пакет и теперь его сможет использовать каждый желающий. Добро пожаловать в сообщество)
Полный гайд по созданию пакетов на Python для PyPI
Проверка собрал ли ты работающий пакет
После успешной сборки и загрузки пакета в индекс PyPI (Или тестовый индекс), очень желательно проверить, а работает и импортируется ли твой модуль вообще. Для этого создаём простенький проект, создаём и активируем виртуальное окружение, устанавливаем наш пакет наконец:
Если пакет был загружен на тестовый индекс PyPI, то для того, чтобы его установить, надо:
Не забудь поменять useful-package-timthewebmaster на своё название пакета
А для того, чтобы его обновить, добавь флаг --upgrade
Не забудь поменять useful-package-timthewebmaster на своё название пакета
Если ты уже загружаешь пакеты на публичные сервера PyPI, то устанавливай пакеты, как обычно:
Не забудь поменять useful-package-timthewebmaster на своё название пакета
Дальше нужно просто запустить проект, который использует твой пакет и проверить его работу. В нашем случае, просто запустить скрипт через терминал: