Что такое PyPI?
PyPI (Python Package Index) - это каталог модулей и библиотек для языка программирования Python, которые могут использовать все. Я думаю, все, кто программируют на Python, хотя бы раз устанавливали и использовали модули. Так вот, все пользовательские модули (т. е. те модули, которые вы устанавливаете, а не те, которые идут из-под коробки) выложены на PyPI.
Что нам нужно?
Чтобы выложить свой модуль на PyPI, нам понадобится:
Ваш готовый модуль с правильной структурой файлов (об этом мы поговорим чуть позже).
Аккаунт на PyPI (об этом мы также поговорим позже)
Пакеты setuptools, wheel и twine (их можно установить через pip).
Немного терпения.
Структура проекта
Для дальнейшей работы с модулем нам нужна правильная структура проекта. Вот пример такой структуры:

Рассмотрим каждый файл по отдельности:
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, теперь другие программисты могут его установить и пользоваться им. Спасибо за внимание, мне было приятно поделиться информацией :)