Pull to refresh

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

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.