Питон-пакеты и PyPI
PyPI (Python Package Index) - хранилище питон-либ, установка которых производится с помощью pip install.
PyPI пакет - python-пакет - директория с файлом __init__.py
Создание пакета
Основные шаги прописаны здесь:
Создаем репозиторий
Создаем питон-пакет - директория с __init__.py файлом
Создаем доп-файлы:
README.md - описание проекта
setup.py - модуль с описанием установки пакета для PyPI
LICENSE - лицензия, обычно MIT
Ставим twine
Собираем все в архив:
python .\setup.py sdist bdist_wheelЗаливаем в PyPI:
twine upload dist/*Для загрузки в тестовый PyPI:
twine upload --repository-url https://test.pypi.org/legacy/ dist/*Чтобы не вводить постоянно логин/пароль от PyPI, можно установить переменные среды
TWINE_USERNAME,TWINE_PASSWORD
После загрузки на PyPI, пакет можно установить с помощью
pip install
Еще доп файлы
MANIFEST.in - для добавления непитон файлов, таких как jinja2-шаблонов, в пакет, пример:
include {package}/templates/*CHANGELOG.md - описание изменений в новых версиях пакета (формат). Версионирование пакетов хорошо делать соглано правилам версионирования пакетов.
Обновление версии
Для автоматизации версионирования пакетов можно использовать bump2version:
Устанавливаем:
Создаем конфиг - .bumpversion.cfg:
Обновляем версию:
setup.py
Если нужно добавить зависимости от других пакетов, необходимо прописать настройку
install_requiresв функцииsetuptools.setupв формате «{package}{operator}{version}»(например,"jinja2>=2.10")
Приватный PyPI
Установка сервера
Для того, чтобы залить пакет на приватный PyPI (например, если пакет содержит бизнес инфу, которую не надо шарить за пределы работки), необходимо поднять приватный PyPI:
Создаем директорию, где будут находится пароль от pypi и сами пакеты:
Устанавливаем PyPI сервер с passlib-зависимостью, необходимой для доступа к PyPI с паролем:
Устанавливаем htpasswd для создания пароля:
Создаем файл с паролем и заполняем его для юзера, по которому мы будем стучаться на PyPI (например, pypi) :
Создаем директорию ддя пакетов:
Можем запустить pypi-сервер:
Если команда ничего не выводит, значит все ок, и теперь можно создать supervisor-программу:
Далее создаем nginx-директиву:
Теперь, перейдя по {айпи, где крутится nginx}:8091, увидим сообщение о развернутом pypi-сервере:
Загрузка пакетов
Для загрузки пакетов на 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:
Устанавливаем новые зависимости:
Собираем и загружаем в PyPI:
Инкремент версии
Загрузка в приватный PyPI
Добавление приватного репозитория {host:port}, с именем {pypi_alias}:
Добавление логина/пароля для доступа в приватный репо:
Загрузка пакета:
Last updated
Was this helpful?