Как стать автором
Обновить

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

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

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.