Poetry: Python Dependency Management

Poetry — это инструмент для управления зависимостями, виртуальными средами и упаковки в Python. Он позволяет вам объявить библиотеки, от которых зависит ваш проект, и он будет управлять (устанавливать/обновлять) их для вас. Poetry (python dependency management) предлагает файл блокировки для обеспечения повторных установок и может создать ваш проект для распространения.

Почему важно управлять зависимостями?

Управление зависимостями является ключевым в разработке программного обеспечения. Вот несколько преимуществ управления зависимостями:

  1. Стабильность кода: Управление зависимостями гарантирует надежную и последовательную работу программного обеспечения. Эффективное управление зависимостями позволяет избежать конфликтов, несовместимостей и неожиданных ошибок в коде.
  2. Сотрудничество с коллегами: Управление зависимостями является критическим при работе нескольких разработчиков над одним проектом. Оно гарантирует, что все члены команды используют одни и те же версии зависимостей, что позволяет избежать проблем совместимости.
  3. Удобство обслуживания: Инструменты управления зависимостями упрощают установку, обновление и удаление зависимостей. Автоматизация этих процессов экономит время разработчиков, и проект всегда остается актуальным.
  4. Расширяемость: Управление зависимостями становится все сложнее в больших проектах. Благодаря автоматизации управления зависимостями можно легко интегрировать новые библиотеки в существующий код.
  5. Непрерывная интеграция и развертывание: При правильном управлении зависимостями можно значительно ускорить автоматизированные процессы тестирования и развертывания.

Эти аспекты показывают, что правильное управление зависимостями является неотъемлемой частью программных проектов. В следующем разделе мы рассмотрим инструмент Poetry.

Какие варианты управления зависимостями в Python существуют?

Прежде чем продолжить, я думаю, будет полезно немного больше узнать о различных инструментах управления зависимостями, которые мы будем сравнивать.

Conda: Conda — это инструмент управления зависимостями, который идет вместе с Anaconda. Anaconda обычно используется начинающими специалистами в области анализа данных, которые только начинают работать с программированием на Python и не хотят заморачиваться с установкой распространенных зависимостей, таких как numpy, pandas, jupyter и scikit-learn. Более подробную информацию о Conda можно найти в его документации, а у Anaconda есть своя собственная домашняя страница.

Pip: Pip — это инструмент управления зависимостями, который поставляется вместе с стандартной установкой Python для Windows и может быть установлен с помощью Homebrew для MacOS и менеджера приложений дистрибуции для систем Linux (например, apt для Debian и Ubuntu). В этой статье от Real Python дается довольно хорошее описание того, как начать работу с Pip.

Poetry: Poetry — это новый инструмент управления зависимостями, который становится все более популярным среди пользователей Python. Использование файлов pyproject.toml и poetry.lock делает его похожим на то, как работает менеджер пакетов Node Package Manager (npm) для Node.js. Более подробную информацию о Poetry можно найти в его документации.

Зачем использовать Poetry в Python?

Не говоря уже о том, что нет ничего плохого в использовании «pip» или «pipenv», но Poetry был создан для решения определенных проблем в обоих этих инструментах, или по крайней мере, проблем в более старых версиях. Ниже приведены эти проблемы, а также то, как Poetry стремится с ними справиться.

  1. Управление зависимостями: Для наилучшей эффективности использования pip требуется некоторая ручная настройка. Poetry нацелен на устранение этого и на то, чтобы быть более пользовательским, чтобы общие задачи стали более простыми.
  2. Более продвинутый Resolver: Poetry имеет более продвинутое разрешение зависимостей, поэтому он может эффективнее обрабатывать конфликты и не приводит к проблемам с версионированием.
  3. Виртуальное окружение: Poetry использует встроенное виртуальное окружение, которое легче настраивать. В то время как pip и pipenv полагались на модуль «venv», который мог быть немного громоздким для настройки.
  4. Активно развивается: Поскольку Poetry новее, он активно разрабатывается и управляется, с частыми исправлениями ошибок и обновлениями с новыми функциями.
  5. Упаковка: Управление пакетами, созданными с использованием Poetry’s PyPI, гораздо проще. Он содержит несколько встроенных команд, которые значительно облегчают работу с пакетами, что экономит время в долгосрочной перспективе.

Команды Poetry (python dependency management)

Установка инструмента (Требуется Python 3.7+):
curl -sSL https://install.python-poetry.org | python3 -
Обновить poetry на новую версию:
poetry self update
Установить конкретную версию:
poetry self update 1.2.0
Полностью удалить poetry из системы (2 способа):
curl -sSL https://install.python-poetry.org | python3 - --uninstall

curl -sSL https://install.python-poetry.org | POETRY_UNINSTALL=1
python3 -
Создать новый проект:
poetry new test_project
# Содержимое каталога
poetry-demo
├── pyproject.toml
├── README.md
├── poetry_demo
│   └── __init__.py
└── tests
    └── __init__.py

Инициализация существующего проекта. Вместо создания нового проекта Poetry можно использовать для «инициализации» предварительно
заполненного каталог.

cd test_project
poetry init
Структура pyproject.toml
[tool.poetry]
name = "poetry-demo"  # Имя проекта должно совпадать с папкой
version = "0.1.0"
description = ""
authors = ["None None <sebastien@eustace.io>"]
readme = "README.md"
packages = [{include = "poetry_demo"}]
[tool.poetry.dependencies]
python = "^3.7"  # Все зависимости и либы проекта
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

Если вы хотите добавить либу в зависимости, то можете указать следующим образом:

[tool.poetry.dependencies]
pendium = "^2.1"

Poetry использует эту информацию для поиска нужного набора файлов в «репозиториях» пакетов, которые вы регистрируете в tool.poetry.source .

Также можно установить пакет отдельно, он автоматически добавится в pyproject.toml:

poetry add pendium

Пакет будет добавлен в poetry.lock, который в дальнейшем нужно переносить на другие пк, так как именно из него poetry будет выгружать такие же пакеты, чтобы создать идентичную среду. Этот пакет ставится в виртуальное окружение директории $HOME/.cache/pypoetry/virtualenvs/... , в дальнейшем на нужно лишь активировать среду, чтобы воспользоваться всеми либами:

poetry shell
Запустить скрипт из под виртуального окружения не заходя в него:
poetry run python your_script.py

Аналогично, если у вас есть инструменты командной строки, такие как pytest или black вы можете запустить их, используя poetry run pytest.

Установить все зависимости проекта:
poetry install

Происходит одно из двух. Если вы никогда раньше не запускали эту команду, она просто установит все зависимости, перечисленные в вашем и загрузит последнюю версию своих файлов.

После завершения установки Poetry записывает все загруженные пакеты и их точные версии в poetry.lock . Вы должны добавить poetry.lock файл в репозиторий вашего проекта. Тогда все люди, работающие над проектом, были привязаны к одним и тем же версиям зависимостей. Разработчики приложений должны добавить poetry.lock чтобы получить более воспроизводимые сборки. Отправка этого файла важна. Чтобы любой, кто настраивает проект, смог использовать те же версии зависимостей, что и вы.

Ваш сервер CI, production, другие разработчики, все работают на одних и тех же зависимостях. Это снижает вероятность ошибок, затрагивающих только некоторые части развертывания. Даже если вы разрабатываете в одиночку, уже через полгода при переустановке проекта вы можете запутаться. Установленные зависимости все еще работают, даже если появилось много новых версий. Poetry python dependency management.

Отключить автоматическое создание виртуального окружения:
poetry config virtualenvs.create false

Иногда не нужно создавать окружение для каждого проекта, данная команда отключит принудительное окружение.

Посмотреть все установленные библиотеки и зависимости:
poetry show --tree
# Вывод:
pendulum 2.1.2 Python datetimes made easy
├── python-dateutil >=2.6,<3.0
│   └── six >=1.5
└── pytzdata >=2020.1
requests 2.31.0 Python HTTP for Humans.
├── certifi >=2017.4.17
├── charset-normalizer >=2,<4
├── idna >=2.5,<4
└── urllib3 >=1.21.1,<3
Посмотреть текущие версии библиотек и сравнить версии с новыми
poetry show --latest

# Вывод:
st
certifi            2023.5.7 2023.5.7
charset-normalizer 3.2.0    3.2.0
idna               3.4      3.4
pendulum           2.1.2    2.1.2
python-dateutil    2.8.2    2.8.2
pytzdata           2020.1   2020.1
requests           2.31.0   2.31.0
six                1.16.0   1.16.0
urllib3            2.0.3    2.0.3
Добавить скрипты в poetry
[tool.poetry]
name = "test-project"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]
readme = "README.md"
packages = [{include = "test_project"}]

[tool.poetry.dependencies]
python = "^3.10"
requests = "^2.31.0"
pendulum = "^2.1.2"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

# Добавляем данную строчку
[tool.poetry.scripts]
hello = "tmp.main:run"

Далее создаем файл main.py в папке tmp, внутри main.py объявляем функцию run:
├── main.py
├── poetry.lock
├── pyproject.toml
├── README.md
├── test_project
│ └── init.py
├── tests
│ └── init.py
└── tmp
├── pycache
│ └── main.cpython-310.pyc

└── main.py

def run():
    print("hello world")
Далее запускаем наш скрипт:
poetry install  # Сделать скрипт доступным внутри окружения
poetry run hello
Посмотреть информацию об окружении:
poetry env info

# Вывод:
Virtualenv
Python:         3.10.10
Implementation: CPython
Path:           /home/user/.cache/pypoetry/virtualenvs/test-project-
4SqJxhhF-py3.10
Executable:     /home/user/.cache/pypoetry/virtualenvs/test-project-
4SqJxhhF-py3.10/bin/python
Valid:          True

System
Platform:   linux
OS:         posix
Python:     3.10.10
Path:       /usr
Executable: /usr/bin/python3.10
Обновить версии зависимостей и poetry.lock:
poetry update
Обновить poetry.lock после изменения файла pyproject.toml:
poetry lock
Удалить зависимость из окружения:
poetry remove pygame
Посмотреть зависимости проекта:
poetry show
Посмотреть зависимости конкретного пакета:
poetry show requests

# Вывод:
 name         : requests
 version      : 2.31.0
 description  : Python HTTP for Humans.

dependencies
 - certifi >=2017.4.17
 - charset-normalizer >=2,<4
 - idna >=2.5,<4
 - urllib3 >=1.21.1,<3
Вывести текущие настройки работы Poetry:
poetry config --list

# Вывод:
cache-dir = "/home/user/.cache/pypoetry"
experimental.system-git-client = false
installer.max-workers = null
installer.modern-installation = true

installer.no-binary = null
installer.parallel = true
virtualenvs.create = true
virtualenvs.in-project = null
virtualenvs.options.always-copy = false
virtualenvs.options.no-pip = false
virtualenvs.options.no-setuptools = false
virtualenvs.options.system-site-packages = false
virtualenvs.path = "{cache-dir}/virtualenvs"
/home/user/.cache/pypoetry/virtualenvs
virtualenvs.prefer-active-python = false
virtualenvs.prompt = "{project_name}-py{python_version}"
Создать окружение с нужной версией Python, которая лежит в PATH:
poetry env use python3.7
Узнать путь к папке с окружением:
poetry env info --path
Удалить виртуальную среду Poetry:
# Выбираем любой подходящий вариант
poetry env remove /full/path/to/python
poetry env remove python3.7
poetry env remove 3.7
poetry env remove test-O3eWbxRl-py3.7

# Удалить несколько виртуальных окружений за раз
poetry env remove python3.6 python3.7 python3.8

Опубликовано

в

от

Комментарии

Добавить комментарий