Poetry: современный менеджер зависимостей и виртуальных окружений для Python
В современной разработке на Python управление зависимостями и виртуальными окружениями является критически важной задачей. Стандартные инструменты вроде pip и venv работают, но имеют ряд ограничений. Poetry — это современная альтернатива, которая решает многие проблемы управления проектами и делает процесс разработки более эффективным и предсказуемым.
В этой статье вы научитесь:
- Устанавливать и настраивать Poetry
- Создавать и управлять виртуальными окружениями
- Управлять зависимостями с точным контролем версий
- Использовать основные команды Poetry для работы с проектами
- Структурировать проекты с помощью
pyproject.toml - Интегрировать Poetry с различными IDE и инструментами
Почему Poetry лучше стандартных инструментов?
Стандартные инструменты Python (pip, venv, requirements.txt) имеют несколько недостатков:
- Неоднозначность версий:
requirements.txtне всегда точно фиксирует версии зависимостей и их подзависимостей - Ручное управление: создание виртуального окружения, активация, установка зависимостей — много ручных шагов
- Отсутствие разделения: нет встроенного разделения на production и development зависимости
- Отсутствие метаданных проекта: нет централизованного места для описания проекта
Poetry решает эти проблемы и предоставляет дополнительные преимущества:
- Детерминированная сборка: фиксирует точные версии всех зависимостей в
poetry.lock - Автоматическое управление виртуальными окружениями: Poetry создает и управляет виртуальными окружениями автоматически
- Современный формат конфигурации: использует стандарт
pyproject.tomlвместо множества файлов - Встроенная поддержка публикации пакетов: легко публиковать свои пакеты в PyPI
- Интуитивный CLI: понятные команды для всех операций
Установка Poetry
Существует несколько способов установки Poetry. Рекомендуется использовать официальный установщик для обеспечения изоляции и корректного обновления.
Официальный установщик (рекомендуется)
Для Windows:
(Invoke-WebRequest -Uri https://install.python-poetry.org/ -UseBasicParsing).Content | python -
Для Linux/macOS:
curl -sSL https://install.python-poetry.org | python3 -
Результат выполнения в терминале:
Retrieving Poetry metadata
# Welcome to Poetry!
This will download and install the latest version of Poetry,
a dependency and package manager for Python.
It will add the `poetry` command to Poetry's bin directory, located at:
$HOME/.local/bin
You can uninstall at any time by executing this script with the --uninstall option,
and these changes will be reverted.
Installing Poetry (1.7.1): Done
Poetry (1.7.1) is installed now. Great!
To get started you need Poetry's bin directory ($HOME/.local/bin) in your PATH
environment variable.
Alternatively, you can call Poetry explicitly with $HOME/.local/bin/poetry.
Проверка установки
После установки проверьте версию Poetry:
poetry --version
Результат выполнения в терминале:
Poetry (version 1.7.1)
Альтернативные методы установки
Хотя официальный установщик является предпочтительным, можно использовать и другие методы:
# Установка через pip (не рекомендуется для глобальной установки)
pip install poetry
# Установка через pipx (рекомендуется, если вы предпочитаете pipx)
pipx install poetry
Инициализация нового проекта
Создание нового проекта с Poetry начинается с инициализации. Эта команда создаст файл pyproject.toml с метаданными проекта.
Запуск инициализации
poetry init
Результат выполнения в терминале:
This command will guide you through creating your pyproject.toml config.
Package name [my-project]: my-awesome-app
Version [0.1.0]:
Description: My first Poetry project
Author [Alex Smith <Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. >, n to skip]: Maria Johnson <Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. >
License [MIT]:
Compatible Python versions [^3.8]: ^3.9
Would you like to define your main dependencies interactively? (yes/no) [no] no
Would you like to define your development dependencies interactively? (yes/no) [no] no
Do you confirm generation? (yes/no) [yes] yes
Результат инициализации
В результате будет создан файл pyproject.toml со следующим содержимым:
[tool.poetry]
name = "my-awesome-app"
version = "0.1.0"
description = "My first Poetry project"
authors = ["Maria Johnson <Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. >"]
license = "MIT"
readme = "README.md"
packages = [{include = "my_awesome_app"}]
[tool.poetry.dependencies]
python = "^3.9"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
Разберем структуру файла:
[tool.poetry]— основные метаданные проекта[tool.poetry.dependencies]— зависимости для production[build-system]— настройки сборки пакета
Основные команды Poetry
Poetry предоставляет множество команд для управления проектами. Рассмотрим самые важные из них.
poetry install
Команда poetry install устанавливает все зависимости, указанные в pyproject.toml, создает виртуальное окружение и устанавливает проект в режиме разработки.
poetry install
Особенности команды:
- Если файл
poetry.lockсуществует, зависимости будут установлены с версиями, указанными в нем - Если файл
poetry.lockотсутствует, Poetry создаст его автоматически - По умолчанию устанавливаются и production, и development зависимости
- Для установки только production зависимостей:
poetry install --no-dev
poetry update
Команда poetry update обновляет все зависимости до последних версий, разрешенных в pyproject.toml, и обновляет файл poetry.lock.
poetry update
Особенности команды:
- Обновляет все зависимости до последних версий в рамках заданных ограничений
- Обновляет файл
poetry.lockс новыми версиями - Для обновления конкретного пакета:
poetry update package_name
poetry add
Команда poetry add добавляет новую зависимость в проект и обновляет файлы конфигурации.
poetry add requests
Особенности команды:
- Автоматически определяет последнюю версию пакета
- Добавляет зависимость в
pyproject.toml - Обновляет файл
poetry.lock - Устанавливает пакет в текущее виртуальное окружение
poetry remove
Команда poetry remove удаляет зависимость из проекта.
poetry remove requests
Особенности команды:
- Удаляет зависимость из
pyproject.toml - Обновляет файл
poetry.lock - Удаляет пакет из виртуального окружения
poetry show
Команда poetry show показывает информацию о зависимостях проекта.
poetry show
Результат выполнения в терминале:
fastapi 0.103.2 The ultimate Python web framework.
pydantic 2.4.2 Data validation using Python type hints
starlette 0.27.0 The little ASGI framework that shines
typing-extensions 4.8.0 Backported and Experimental Type Hints for Python
uvicorn 0.23.2 The lightning-fast ASGI server
Полезные опции:
--tree— показывает дерево зависимостей--outdated— показывает устаревшие пакеты--latest— показывает последние доступные версии--all— показывает все пакеты, включая development зависимости
poetry lock
Команда poetry lock генерирует или обновляет файл poetry.lock без установки зависимостей.
poetry lock
Особенности команды:
- Полезно при работе с CI/CD пайплайнами
- Гарантирует, что все разработчики используют одинаковые версии зависимостей
- С
--no-updateобновляет только хеш-суммы без изменения версий
poetry build
Команда poetry build собирает проект в формате wheel и source distribution.
poetry build
Результат выполнения:
Создает два файла в директории dist/:
my_project-0.1.0-py3-none-any.whl— wheel дистрибутивmy_project-0.1.0.tar.gz— source дистрибутив
poetry publish
Команда poetry publish публикует собранный пакет в PyPI или другой репозиторий.
poetry publish
Подготовка к публикации:
# Настройка учетных данных
poetry config pypi-token.pypi your-pypi-token
# Сборка и публикация
poetry build
poetry publish
Работа с зависимостями и версиями
Одна из сильных сторон Poetry — точный контроль над версиями зависимостей. Рассмотрим различные способы указания версий.
Семантическое версионирование в Poetry
Poetry использует семантическое версионирование (SemVer) для управления зависимостями. Основные операторы:
^1.2.3— версии >=1.2.3, но <2.0.0~1.2.3— версии >=1.2.3, но <1.3.0>=1.2.3— версии >=1.2.3>=1.2.3,<2.0— версии в диапазоне от 1.2.3 до 2.0==1.2.3— точная версия 1.2.3*— любая версия
Примеры использования
# Точная версия
poetry add "django==3.2.18"
# Минимальная версия
poetry add "numpy>=1.21.0"
# Диапазон версий
poetry add "pandas>=1.3.0,<1.4.0"
# Совместимая версия (SemVer)
poetry add "requests^2.28.0"
# Точное соответствие major версии
poetry add "flask~2.2.0"
Работа с предрелизными версиями
Poetry поддерживает работу с предрелизными версиями (alpha, beta, rc):
# Установка конкретной предрелизной версии
poetry add "fastapi==0.100.0rc1"
# Установка любой предрелизной версии
poetry add "fastapi=0.100.0-rc1 --allow-prereleases"
# Установка последней версии, включая предрелизы
poetry add "fastapi@latest --allow-prereleases"
Управление версиями в pyproject.toml
После добавления зависимостей файл pyproject.toml содержит информацию о версиях:
[tool.poetry.dependencies]
python = "^3.9"
fastapi = "^0.103.2"
uvicorn = {extras = ["standard"], version = "^0.23.2"}
requests = ">=2.28.0,<3.0.0"
numpy = "==1.24.3"
pandas = {version = "^1.5.3", optional = true}
Файл poetry.lock
Файл poetry.lock содержит точные версии всех зависимостей и их подзависимостей. Это гарантирует, что все разработчики и среды развертывания используют одинаковые версии пакетов.
Пример фрагмента файла poetry.lock:
[[package]]
name = "fastapi"
version = "0.103.2"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
category = "main"
optional = false
python-versions = ">=3.7"
[[package]]
name = "pydantic"
version = "2.4.2"
description = "Data validation using Python type hints"
category = "main"
optional = false
python-versions = ">=3.7"
# Зависимости pydantic
[package.dependencies]
annotated-types = ">=0.4.0,<0.7.0"
pydantic-core = "2.10.1"
typing-extensions = ">=4.6.0"
Правила работы с poetry.lock:
- Всегда добавляйте
poetry.lockв Git для библиотек и приложений - Не добавляйте
poetry.lockв Git для пакетов, которые будут использоваться как зависимости - Для обновления версий используйте
poetry update, а не ручное редактирование файла
Управление группами зависимостей
Poetry поддерживает разделение зависимостей на группы, что позволяет различать production и development зависимости.
Добавление development зависимостей
poetry add pytest --group dev
poetry add black --group dev
poetry add mypy --group dev
Результат в pyproject.toml:
[tool.poetry.group.dev.dependencies]
pytest = "^7.4.4"
black = "^23.11.0"
mypy = "^1.7.1"
Работа с кастомными группами
Можно создавать кастомные группы зависимостей:
poetry add pytest --group test
poetry add sphinx --group docs
Запуск с определенными группами:
# Установка только production зависимостей
poetry install --no-dev
# Установка production + test зависимостей
poetry install --only main,test
# Установка только development зависимостей
poetry install --only dev
Работа с виртуальными окружениями
Poetry автоматически управляет виртуальными окружениями, но предоставляет команды для явного управления ими.
Активация виртуального окружения
Чтобы активировать виртуальное окружение, созданное Poetry:
poetry shell
Результат выполнения в терминале:
Spawning shell within /Users/maria/Library/Caches/pypoetry/virtualenvs/fastapi-app-5zX4i6vT-py3.8
. /Users/maria/Library/Caches/pypoetry/virtualenvs/fastapi-app-5zX4i6vT-py3.8/bin/activate
(fastapi-app-py3.8) $
Выполнение команд в виртуальном окружении
Чтобы выполнить команду в виртуальном окружении без его активации:
poetry run uvicorn main:app --reload
Результат выполнения в терминале:
INFO: Will watch for changes in these directories: ['D:\\projects\\fastapi-app']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [12345] using StatReload
INFO: Started server process [12346]
INFO: Waiting for application startup.
INFO: Application startup complete.
Просмотр информации об окружении
Чтобы узнать, где находится виртуальное окружение:
poetry env info
Результат выполнения в терминале:
Virtualenv
Python: 3.9.18
Implementation: CPython
Path: /Users/maria/Library/Caches/pypoetry/virtualenvs/my-awesome-app-5zX4i6vT-py3.9
Executable: /Users/maria/Library/Caches/pypoetry/virtualenvs/my-awesome-app-5zX4i6vT-py3.9/bin/python
Valid: True
System
Platform: darwin
OS: posix
Python: 3.9.18
Path: /Users/maria/.pyenv/versions/3.9.18
Executable: /Users/maria/.pyenv/versions/3.9.18/bin/python
Удаление виртуального окружения
Если нужно пересоздать виртуальное окружение:
poetry env remove python
Или для конкретной версии Python:
poetry env remove 3.9
Управление несколькими окружениями
Poetry позволяет работать с несколькими версиями Python в одном проекте:
# Просмотр доступных окружений
poetry env list
# Использование конкретной версии Python
poetry env use python3.9
poetry env use /path/to/python3.11
# Создание окружения для конкретной версии
poetry env use 3.10
Экспорт и импорт зависимостей
Иногда необходимо интегрироваться со стандартными инструментами Python, для этого Poetry поддерживает экспорт зависимостей.
Экспорт в requirements.txt
Для экспорта всех зависимостей (включая подзависимости) в формат requirements.txt:
poetry export -f requirements.txt --output requirements.txt
Для экспорта только production-зависимостей:
poetry export -f requirements.txt --without-hashes --output requirements.txt
Для экспорта с development-зависимостями:
poetry export -f requirements.txt --dev --output requirements-dev.txt
Импорт из requirements.txt
Чтобы импортировать зависимости из существующего файла requirements.txt:
# Импорт всех зависимостей
cat requirements.txt | xargs poetry add
# Импорт development зависимостей
cat requirements-dev.txt | xargs poetry add --group dev
Практический пример: создание FastAPI проекта с Poetry
Давайте рассмотрим полный пример создания FastAPI-приложения с использованием Poetry.
Шаг 1: Инициализация проекта
mkdir fastapi-project
cd fastapi-project
poetry init
Ответьте на вопросы инициализатора. Результат — файл pyproject.toml.
Шаг 2: Добавление зависимостей
poetry add fastapi "uvicorn[standard]"
poetry add pydantic[email] --optional
poetry add requests
poetry add python-jose[cryptography] passlib[bcrypt] --optional
После этих команд файл pyproject.toml будет выглядеть примерно так:
[tool.poetry]
name = "fastapi-project"
version = "0.1.0"
description = ""
authors = ["Your Name <Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. >"]
readme = "README.md"
packages = [{include = "fastapi_project"}]
[tool.poetry.dependencies]
python = "^3.9"
fastapi = "^0.103.2"
uvicorn = {extras = ["standard"], version = "^0.23.2"}
pydantic = {extras = ["email"], version = "^2.4.2", optional = true}
requests = "^2.31.0"
python-jose = {extras = ["cryptography"], version = "^3.3.0", optional = true}
passlib = {extras = ["bcrypt"], version = "^1.7.4", optional = true}
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
Шаг 3: Создание структуры проекта
mkdir fastapi_project
touch fastapi_project/__init__.py
touch fastapi_project/main.py
mkdir fastapi_project/api
touch fastapi_project/api/__init__.py
touch fastapi_project/api/items.py
touch fastapi_project/api/users.py
Шаг 4: Написание кода приложения
Файл fastapi_project/api/items.py:
from fastapi import APIRouter
from typing import List, Dict, Any
router = APIRouter(tags=['items'])
@router.get('/')
def items_list() -> Dict[str, List[Dict[str, Any]]]:
return {
"items": [
{"id": 1, "name": "foobar"},
{"id": 2, "name": "spam-and-eggs"},
]
}
@router.post('/')
def create_item(name: str, data: Dict[str, Any]) -> Dict[str, Any]:
return {
"data": data,
"name": name
}
@router.get('/{item_id}/')
def get_item(item_id: int) -> Dict[str, Dict[str, Any]]:
return {
"data": {
"id": item_id,
"name": f"item-{item_id}"
}
}
Файл fastapi_project/main.py:
from fastapi import FastAPI
import uvicorn
from .api.items import router as items_router
app = FastAPI(title="FastAPI Project", version="1.0.0")
app.include_router(items_router, prefix="/items")
@app.get("/")
def index():
return {"message": "Hello Index!"}
@app.get("/hello/")
def hello(name: str = "World"):
return {"message": f"Hello {name}"}
if __name__ == "__main__":
uvicorn.run("fastapi_project.main:app", host="0.0.0.0", port=8000, reload=True)
Шаг 5: Запуск приложения
poetry run python -m fastapi_project.main
Результат выполнения в терминале:
INFO: Will watch for changes in these directories: ['/Users/maria/projects/fastapi-project']
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO: Started reloader process [12345] using StatReload
INFO: Started server process [12346]
INFO: Waiting for application startup.
INFO: Application startup complete.
Шаг 6: Добавление инструментов разработки
poetry add pytest httpx --group dev
poetry add black isort mypy --group dev
Теперь можно писать тесты и запускать их:
poetry run pytest
poetry run black .
poetry run mypy fastapi_project
Интеграция с IDE
VS Code
Для интеграции с VS Code установите расширение "Python" и добавьте следующие настройки в .vscode/settings.json:
{
"python.pythonPath": ".venv/bin/python",
"python.formatting.provider": "black",
"python.linting.enabled": true,
"python.linting.pylintEnabled": false,
"python.linting.flake8Enabled": true,
"python.linting.mypyEnabled": true,
"python.testing.pytestEnabled": true,
"python.testing.unittestEnabled": false,
"python.testing.nosetestsEnabled": false,
"terminal.integrated.env.linux": {
"PATH": "${workspaceFolder}/.venv/bin:${env:PATH}"
},
"terminal.integrated.env.osx": {
"PATH": "${workspaceFolder}/.venv/bin:${env:PATH}"
},
"terminal.integrated.env.windows": {
"PATH": "${workspaceFolder}\\.venv\\Scripts;${env:PATH}"
}
}
PyCharm
В PyCharm:
- Выберите File → Settings → Project → Python Interpreter
- Нажмите на шестеренку → Add
- Выберите "Poetry Environment"
- Укажите путь к файлу
pyproject.toml - PyCharm автоматически создаст и настроит виртуальное окружение
GitHub Actions
Пример конфигурации GitHub Actions для Poetry-проекта:
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.11"
- name: Install Poetry
run: pipx install poetry
- name: Install dependencies
run: poetry install --no-interaction
- name: Run tests
run: poetry run pytest
- name: Run linting
run: poetry run black --check . && poetry run mypy .
Чек-лист для проверки усвоения материала
| № | Проверяемый навык / знание | Статус |
|---|---|---|
| 1 | Я понимаю, чем Poetry отличается от pip и виртуальных окружений. | |
| Я могу установить Poetry на свой компьютер. | ||
| Я понимаю преимущества использования Poetry для управления проектами. | ||
| 2 | Я умею инициализировать новый проект с помощью poetry init. |
|
Я понимаю структуру файла pyproject.toml. |
||
| Я могу настроить метаданные проекта (авторы, лицензия, описание). | ||
| 3 | Я умею использовать команду poetry install и понимаю ее отличия от pip install. |
|
Я умею работать с командой poetry show для просмотра зависимостей. |
||
Я понимаю назначение команды poetry lock и файла poetry.lock. |
||
Я умею обновлять зависимости с помощью poetry update. |
||
| 4 | Я умею добавлять зависимости с точными версиями с помощью poetry add. |
|
| Я понимаю семантическое версионирование (SemVer) и операторы ^, ~, >=, <=. | ||
| Я умею работать с development-зависимостями и группами зависимостей. | ||
| Я умею экспортировать зависимости в формат requirements.txt. | ||
| 5 | Я умею активировать виртуальное окружение с помощью poetry shell. |
|
Я умею выполнять команды в виртуальном окружении с помощью poetry run. |
||
| Я понимаю, как Poetry управляет виртуальными окружениями и где они хранятся. | ||
| 6 | Я могу создать полноценный проект на FastAPI с использованием Poetry. | |
| Я умею настраивать интеграцию Poetry с IDE (VS Code, PyCharm). |
Практическое задание для закрепления
- Создайте виртуальное окружение для нового проекта с помощью Poetry:
- Инициализируйте проект с помощью
poetry init - Заполните метаданные (имя, описание, автора, лицензию)
- Добавьте зависимости:
fastapiиuvicorn[standard] - Добавьте development-зависимости:
pytest,black,mypy
- Инициализируйте проект с помощью
- Работа с версиями:
- Добавьте
requestsс точной версией 2.31.0 - Добавьте
numpyс ограничением >=1.24.0,<2.0.0 - Просмотрите дерево зависимостей с помощью
poetry show --tree - Обновите все зависимости до последних версий с помощью
poetry update
- Добавьте
- Создайте тесты:
- Напишите несколько unit-тестов для вашего приложения
- Запустите тесты с помощью
poetry run pytest - Проверьте типы с помощью
poetry run mypy . - Отформатируйте код с помощью
poetry run black .
- Экспорт и интеграция:
- Экспортируйте production-зависимости в
requirements.txt - Создайте GitHub Actions workflow для автоматического тестирования
- Настройте интеграцию с вашей IDE (VS Code или PyCharm)
- Экспортируйте production-зависимости в
После выполнения заданий вы будете уверенно использовать Poetry для управления своими Python-проектами, понимать преимущества перед стандартными инструментами и уметь создавать хорошо структурированные приложения с четким разделением зависимостей.
Совет: Используйте Poetry для всех своих новых проектов, даже небольших. Привычка работать с современными инструментами значительно упростит вашу жизнь при переходе к большим и сложным проектам. Всегда коммитьте файл
poetry.lockв Git — это гарантирует воспроизводимость сборки на всех машинах.
Удачной разработки!
