什么是 Poetry?
Poetry 是一个现代化的 Python 项目管理和依赖管理工具,它解决了 Python 生态系统中长期存在的依赖管理痛点。Poetry 将项目管理、依赖管理、虚拟环境管理和发布打包整合到一个统一的工具中,让 Python 开发变得更加优雅和高效。
为什么选择 Poetry?
传统方式的痛点
在 Poetry 出现之前,Python 开发者通常使用以下工具组合:
| 工具 | 功能 | 问题 |
|---|---|---|
| pip | 安装依赖 | 没有锁文件,依赖版本不精确 |
| virtualenv | 创建虚拟环境 | 需要额外管理 |
| setup.py | 项目配置 | 配置繁琐,容易出错 |
| pip-tools | 锁定依赖 | 需要多个工具配合 |
常见问题:
- 依赖版本冲突难以解决
- 不同环境下的依赖版本不一致
- 项目配置分散在多个文件中
- 发布流程需要额外工具
Poetry 的优势
统一管理: 一个工具搞定所有事情
poetry = pip + virtualenv + pip-tools + setuptools + twine
确定性构建: 使用 poetry.lock 锁文件,确保所有环境依赖一致
依赖解析: 自动处理依赖冲突,智能选择兼容版本
简化发布: 一条命令发布到 PyPI
安装 Poetry
推荐方式
bash
# 使用官方安装脚本
curl -sSL https://install.python-poetry.org | python3 -
# 或使用 pipx(推荐用于隔离安装)
pipx install poetry
验证安装
bash
poetry --version
# Poetry (version 1.8.3)
配置
bash
# 查看当前配置
poetry config --list
# 创建虚拟环境在项目目录内(推荐)
poetry config virtualenvs.in-project true
# 设置镜像源(国内用户)
poetry config repositories.pypi https://pypi.tuna.tsinghua.edu.cn/simple
基本使用
创建新项目
bash
# 创建完整项目结构
poetry new my-project
# 目录结构
my-project/
├── pyproject.toml # 项目配置文件
├── README.md
├── my_project/
│ └── __init__.py
└── tests/
└── __init__.py
在现有项目中初始化
bash
cd existing-project
poetry init
# 交互式创建 pyproject.toml
管理依赖
bash
# 添加依赖
poetry add requests
poetry add pandas numpy
# 添加开发依赖
poetry add pytest --group dev
poetry add black isort flake8 --group dev
# 添加可选依赖
poetry add fastapi --group optional
# 指定版本
poetry add requests@^2.28.0
poetry add django@">=3.2,<4.0"
# 移除依赖
poetry remove requests
poetry remove pytest --group dev
安装依赖
bash
# 安装所有依赖(包括开发依赖)
poetry install
# 只安装生产依赖
poetry install --only main
# 安装特定组
poetry install --with dev
poetry install --with test
# 同步依赖(移除多余包)
poetry install --sync
虚拟环境管理
bash
# 进入虚拟环境 shell
poetry shell
# 在虚拟环境中运行命令
poetry run python main.py
poetry run pytest
poetry run black .
# 查看虚拟环境信息
poetry env info
# 查看虚拟环境路径
poetry env list --full-path
# 删除虚拟环境
poetry env remove python3.11
pyproject.toml 结构
toml
[tool.poetry]
name = "email-ai-processor"
version = "0.1.0"
description = "AI-powered email processing system"
authors = ["Your Name <you@example.com>"]
readme = "README.md"
license = "MIT"
packages = [{include = "src"}]
[tool.poetry.dependencies]
python = "^3.11"
fastapi = "^0.104.0"
pydantic = "^2.5.0"
sqlalchemy = "^2.0.0"
anthropic = "^0.8.0"
[tool.poetry.group.dev.dependencies]
pytest = "^7.4.0"
pytest-asyncio = "^0.21.0"
black = "^23.0"
isort = "^5.12"
mypy = "^1.7"
flake8 = "^6.1"
[tool.poetry.group.test.dependencies]
pytest-cov = "^4.1"
faker = "^20.0"
[tool.poetry.scripts]
email-processor = "src.main:run"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
依赖版本语法
| 语法 | 含义 | 示例 |
|---|---|---|
^1.2.3 |
允许 >=1.2.3, <2.0.0 | caret,兼容更新 |
~1.2.3 |
允许 >=1.2.3, <1.3.0 | tilde,保守更新 |
1.2.3 |
精确版本 | 锁定版本 |
>=1.2.3,<2.0 |
范围约束 | 自定义范围 |
* |
任意版本 | 不推荐使用 |
常用命令速查
bash
# 项目管理
poetry new <name> # 创建新项目
poetry init # 初始化现有项目
poetry build # 构建发布包
# 依赖管理
poetry add <package> # 添加依赖
poetry remove <package> # 移除依赖
poetry show # 显示依赖树
poetry show --tree # 依赖树可视化
poetry show <package> # 显示包详情
poetry update # 更新所有依赖
poetry update <package> # 更新指定依赖
# 环境管理
poetry install # 安装依赖
poetry shell # 进入虚拟环境
poetry run <cmd> # 运行命令
poetry env info # 环境信息
# 发布管理
poetry publish # 发布到 PyPI
poetry publish --repository private # 发布到私有源
# 锁文件
poetry lock # 生成/更新锁文件
poetry lock --no-update # 不更新版本,只刷新锁文件
# 导出 requirements.txt(兼容 pip)
poetry export -f requirements.txt --output requirements.txt
poetry export --without-hashes --output requirements.txt
与 Makefile 配合
makefile
# Makefile 示例
.PHONY: install test lint format
install:
poetry install
dev:
poetry install --with dev
test:
poetry run pytest tests/ -v
lint:
poetry run flake8 src/
poetry run mypy src/ --strict
format:
poetry run black src/ tests/
poetry run isort src/ tests/
shell:
poetry shell
最佳实践
1. 锁文件管理
始终提交 poetry.lock 到版本控制,确保团队成员和 CI/CD 使用相同依赖版本。
bash
# .gitignore 中不要包含
# poetry.lock # ❌ 不要忽略
2. 依赖分组
合理划分依赖组,减少生产环境体积:
toml
[tool.poetry.group.dev.dependencies] # 开发工具
[tool.poetry.group.test.dependencies] # 测试工具
[tool.poetry.group.docs.dependencies] # 文档工具
3. 私有源配置
bash
# 配置私有 PyPI
poetry config repositories.private https://pypi.example.com/simple
poetry config http-basic.private username password
# 从私有源安装
poetry add private-package --source private
4. CI/CD 集成
yaml
# GitHub Actions 示例
- name: Install Poetry
run: pipx install poetry
- name: Install dependencies
run: poetry install --no-interaction
- name: Run tests
run: poetry run pytest
故障排除
依赖冲突
bash
# 查看依赖树,找出冲突
poetry show --tree
# 强制重新解析
poetry lock --no-cache
虚拟环境问题
bash
# 重建虚拟环境
poetry env remove python3.11
poetry install
缓存清理
bash
# 清理 Poetry 缓存
poetry cache clear . --all
总结
Poetry 通过统一的工具链、精确的依赖锁定、智能的冲突解决,让 Python 项目管理变得简单可靠。它是现代 Python 开发的最佳选择之一。
| 特性 | Poetry | pip + tools |
|---|---|---|
| 依赖锁定 | ✅ poetry.lock | ❌ 需 pip-tools |
| 虚拟环境 | ✅ 内置 | ❌ 需 virtualenv |
| 项目配置 | ✅ pyproject.toml | ❌ setup.py |
| 依赖解析 | ✅ 智能 | ❌ 基础 |
| 发布打包 | ✅ 内置 | ❌ 需 twine |
| 命令数量 | 1个工具 | 5+个工具 |