Питон-пакеты и 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:
- Устанавливаем: 
pip install bump2version- Создаем конфиг - .bumpversion.cfg: 
[bumpversion]
current_version = 0.2.0
commit = True
tag = True
[bumpversion:file:setup.py]- Обновляем версию: 
bump2version patchsetup.py
- Если нужно добавить зависимости от других пакетов, необходимо прописать настройку - install_requiresв функции- setuptools.setupв формате «{package}{operator}{version}»(например,- "jinja2>=2.10")
Приватный PyPI
Установка сервера
Для того, чтобы залить пакет на приватный PyPI (например, если пакет содержит бизнес инфу, которую не надо шарить за пределы работки), необходимо поднять приватный PyPI:
- Создаем директорию, где будут находится пароль от pypi и сами пакеты: 
mkdir mypypi && cd mypypi- Устанавливаем PyPI сервер с passlib-зависимостью, необходимой для доступа к PyPI с паролем: 
pipenv install pypiserver[passlib]- Устанавливаем htpasswd для создания пароля: 
sudo apt-get install apache2-utils- Создаем файл с паролем и заполняем его для юзера, по которому мы будем стучаться на PyPI (например, pypi) : 
touch pypipass.txt && htpasswd pypi- Создаем директорию ддя пакетов: 
mkdir packages- Можем запустить pypi-сервер: 
pipenv run pypi-server --port 8090 -i 127.0.0.1 -P pypipass.txt -a update,download,list -r packages- Если команда ничего не выводит, значит все ок, и теперь можно создать supervisor-программу: 
[program:mypypi]
command=pipenv run pypi-server --port 8090 -i 127.0.0.1 -P pypipass.txt -a update,download,list -r packages
directory=/root/mypypi
user=root
autorestart=true- Далее создаем nginx-директиву: 
server {
    listen 8091;
    location / {
            proxy_pass http://localhost:8090/;
    }
}- Теперь, перейдя по {айпи, где крутится nginx}:8091, увидим сообщение о развернутом pypi-сервере: 
Загрузка пакетов
Для загрузки пакетов на pypi-сервер, необходимо указать его адрес с логином и паролем:
twine upload --repository-url http://{user}:{password}@{айпи, где крутится nginx}:8091 dist/*Или адрес без логина и пароля с установленными переменными среды: TWINE_USERNAME, TWINE_PASSWORD
Стягивание пакетов
Для скачивания пакетов необходимо добавить ссылку на pypi-сервер. В случае с pipenv, необходимо в Pipfile добавить директиру source:
[[source]]
url = "http://{user}:{password}@{айпи, где крутится nginx}:8091"
verify_ssl = false
name = "mypypi"Чтобы не палить логин и пароль в Pipfile, можно задать адрес сервера в виде переменной среды и заменить урл в Pipfile:
[[source]]
url = "${MYPYPI_URL}"
verify_ssl = false
name = "mypypi"Теперь можно ставить пакеты как обычно:
pipenv install {package-name}Poetry
Вместо создания setup.py, сборку через sdist, деплой через twine, ункремент через bump2version можно использовать Poetry
Poetry - альтернатива Pipenv и тулза для создания питон-пакетов
Создание пакетов
1.a Создаем pyproject.toml - микс Pipfile и setup.py:
poetry init1.b Для установки зависимостей из существующего pyproject.toml:
poetry install- Устанавливаем новые зависимости: 
poetry add {package_name}- Собираем и загружаем в PyPI: 
poetry publish --build- Инкремент версии 
poetry version (patch|minor|major)Загрузка в приватный PyPI
Добавление приватного репозитория {host:port}, с именем {pypi_alias}:
poetry config repositories.{pypi_alias} {host:port}Добавление логина/пароля для доступа в приватный репо:
poetry config http-basic.{pypi_alias} {username} {password}Загрузка пакета:
poetry publish -r {pypi_alias} --buildLast updated
Was this helpful?