Poetry — это инструмент для управления зависимостями, виртуальными средами и упаковки в Python. Он позволяет вам объявить библиотеки, от которых зависит ваш проект, и он будет управлять (устанавливать/обновлять) их для вас. Poetry (python dependency management) предлагает файл блокировки для обеспечения повторных установок и может создать ваш проект для распространения.
Почему важно управлять зависимостями?
Управление зависимостями является ключевым в разработке программного обеспечения. Вот несколько преимуществ управления зависимостями:
- Стабильность кода: Управление зависимостями гарантирует надежную и последовательную работу программного обеспечения. Эффективное управление зависимостями позволяет избежать конфликтов, несовместимостей и неожиданных ошибок в коде.
- Сотрудничество с коллегами: Управление зависимостями является критическим при работе нескольких разработчиков над одним проектом. Оно гарантирует, что все члены команды используют одни и те же версии зависимостей, что позволяет избежать проблем совместимости.
- Удобство обслуживания: Инструменты управления зависимостями упрощают установку, обновление и удаление зависимостей. Автоматизация этих процессов экономит время разработчиков, и проект всегда остается актуальным.
- Расширяемость: Управление зависимостями становится все сложнее в больших проектах. Благодаря автоматизации управления зависимостями можно легко интегрировать новые библиотеки в существующий код.
- Непрерывная интеграция и развертывание: При правильном управлении зависимостями можно значительно ускорить автоматизированные процессы тестирования и развертывания.
Эти аспекты показывают, что правильное управление зависимостями является неотъемлемой частью программных проектов. В следующем разделе мы рассмотрим инструмент 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 стремится с ними справиться.
- Управление зависимостями: Для наилучшей эффективности использования pip требуется некоторая ручная настройка. Poetry нацелен на устранение этого и на то, чтобы быть более пользовательским, чтобы общие задачи стали более простыми.
- Более продвинутый Resolver: Poetry имеет более продвинутое разрешение зависимостей, поэтому он может эффективнее обрабатывать конфликты и не приводит к проблемам с версионированием.
- Виртуальное окружение: Poetry использует встроенное виртуальное окружение, которое легче настраивать. В то время как pip и pipenv полагались на модуль «venv», который мог быть немного громоздким для настройки.
- Активно развивается: Поскольку Poetry новее, он активно разрабатывается и управляется, с частыми исправлениями ошибок и обновлениями с новыми функциями.
- Упаковка: Управление пакетами, созданными с использованием 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
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.