Питон-пакеты и PyPI

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

PyPI пакет - python-пакет - директория с файлом __init__.py

Создание пакета

Основные шаги прописаны здесь:

  1. Создаем репозиторий

  2. Создаем питон-пакет - директория с __init__.py файлом

  3. Создаем доп-файлы:

    • README.md - описание проекта

    • setup.py - модуль с описанием установки пакета для PyPI

    • LICENSE - лицензия, обычно MIT

  4. Ставим twine

  5. Собираем все в архив: python .\setup.py sdist bdist_wheel

  6. Заливаем в PyPI: twine upload dist/*

    • Для загрузки в тестовый PyPI: twine upload --repository-url https://test.pypi.org/legacy/ dist/*

    • Чтобы не вводить постоянно логин/пароль от PyPI, можно установить переменные среды TWINE_USERNAME, TWINE_PASSWORD

  7. После загрузки на PyPI, пакет можно установить с помощью pip install

Еще доп файлы

  • MANIFEST.in - для добавления непитон файлов, таких как jinja2-шаблонов, в пакет, пример: include {package}/templates/*

  • CHANGELOG.md - описание изменений в новых версиях пакета (формат). Версионирование пакетов хорошо делать соглано правилам версионирования пакетов.

Обновление версии

Для автоматизации версионирования пакетов можно использовать bump2version:

  1. Устанавливаем:

  1. Создаем конфиг - .bumpversion.cfg:

  1. Обновляем версию:

setup.py

  • Если нужно добавить зависимости от других пакетов, необходимо прописать настройку install_requires в функции setuptools.setup в формате «{package}{operator}{version}»(например, "jinja2>=2.10")

Приватный PyPI

Установка сервера

Для того, чтобы залить пакет на приватный PyPI (например, если пакет содержит бизнес инфу, которую не надо шарить за пределы работки), необходимо поднять приватный PyPI:

  1. Создаем директорию, где будут находится пароль от pypi и сами пакеты:

  1. Устанавливаем PyPI сервер с passlib-зависимостью, необходимой для доступа к PyPI с паролем:

  1. Устанавливаем htpasswd для создания пароля:

  1. Создаем файл с паролем и заполняем его для юзера, по которому мы будем стучаться на PyPI (например, pypi) :

  1. Создаем директорию ддя пакетов:

  1. Можем запустить pypi-сервер:

  1. Если команда ничего не выводит, значит все ок, и теперь можно создать supervisor-программу:

  1. Далее создаем nginx-директиву:

  1. Теперь, перейдя по {айпи, где крутится nginx}:8091, увидим сообщение о развернутом pypi-сервере:

https://raw.githubusercontent.com/potykion/py_poc_toolbox/master/_static/pypi.PNG

Загрузка пакетов

Для загрузки пакетов на pypi-сервер, необходимо указать его адрес с логином и паролем:

Или адрес без логина и пароля с установленными переменными среды: TWINE_USERNAME, TWINE_PASSWORD

Стягивание пакетов

Для скачивания пакетов необходимо добавить ссылку на pypi-сервер. В случае с pipenv, необходимо в Pipfile добавить директиру source:

Чтобы не палить логин и пароль в Pipfile, можно задать адрес сервера в виде переменной среды и заменить урл в Pipfile:

Теперь можно ставить пакеты как обычно:

Poetry

Вместо создания setup.py, сборку через sdist, деплой через twine, ункремент через bump2version можно использовать Poetry

Poetry - альтернатива Pipenv и тулза для создания питон-пакетов

Создание пакетов

1.a Создаем pyproject.toml - микс Pipfile и setup.py:

1.b Для установки зависимостей из существующего pyproject.toml:

  1. Устанавливаем новые зависимости:

  1. Собираем и загружаем в PyPI:

  1. Инкремент версии

Загрузка в приватный PyPI

Добавление приватного репозитория {host:port}, с именем {pypi_alias}:

Добавление логина/пароля для доступа в приватный репо:

Загрузка пакета:

Last updated

Was this helpful?