Poetry 实战:用 pyproject.toml 统一 Python 依赖管理与打包发布

对于 Python 开发者来说,Poetry 几乎重新定义了「Python 依赖管理」的体验:一个 pyproject.toml 同时管住依赖、虚拟环境和打包发布,告别 requirements.txt 漂移、virtualenv 散落各处的混乱。本文带你从安装到发布 PyPI,把 Poetry 真正用进日常工程。

一、为什么还需要 Poetry

传统工作流有三个痛点。第一,requirements.txt 只记录顶层依赖,子依赖版本不可控,多人协作经常遇到「在我机器上是好的」。第二,virtualenv 路径散乱,activate 容易忘、容易错。第三,当你想把项目发布成包时,setup.py、setup.cfg、MANIFEST.in 的配置繁琐且容易出错。Poetry 用单一声明文件 + 锁文件 + 内置虚拟环境与发布命令,把这些步骤串成一条流水线。

二、10 分钟上手:安装与初始化

官方推荐用 pipx 把 Poetry 装在独立环境里,避免污染项目依赖。你也可以用官网安装器或 Homebrew。

# 官方推荐:pipx 隔离安装
pipx install poetry

# 官网安装器(通用)
curl -sSL https://install.python-poetry.org | python3 -

# macOS 用户
brew install poetry

安装完成后,用 poetry new 生成标准项目骨架,或在已有目录用 poetry init 交互式生成配置。

poetry --version
poetry new my_project      # 生成 src/ + tests/ 标准结构
poetry init                # 在已有目录交互式生成 pyproject.toml

三、依赖管理:pyproject.toml 的核心玩法

3.1 添加与移除依赖(区分运行时 / 开发)

Poetry 1.2 之后用 group 区分依赖类型,main 是运行时依赖,dev 或其他自定义 group 是开发依赖。部署时只装 main 即可。

poetry add requests                 # 运行时依赖
poetry add -G dev pytest ruff       # 开发依赖(group)
poetry add "django>=4.2,<5"         # 限定版本区间
poetry remove requests              # 移除依赖

3.2 锁文件与可重现安装

poetry.lock 把整棵依赖树精确锁定。提交它之后,所有人、CI、生产环境都能装出完全一致的依赖。

poetry lock                 # 解析依赖并写 poetry.lock
poetry install              # 按 lock 安装
poetry install --sync       # 与 lock 严格对齐,移除多余包
poetry install --only main  # 只装运行时依赖(部署用)
维度pip + requirementsPoetry
依赖解析无,顺序安装有向图求解,冲突早暴露
锁文件需 pip freeze 手写poetry.lock 自动生成
开发/运行分离手动维护多文件group 原生支持
打包发布setup.py 手写build/publish 一条龙

四、虚拟环境:不再手动 activate

Poetry 默认在统一缓存目录创建虚拟环境,你几乎不需要手动 activate。用 poetry run 直接在该环境执行命令,或 poetry shell 进入交互式环境。

poetry env info            # 查看当前环境信息
poetry env use 3.12        # 切换 Python 版本
poetry shell               # 进入虚拟环境 shell
poetry run python main.py  # 无需 activate 直接跑

如果你更喜欢把虚拟环境放在项目内的 .venv,可执行 poetry config virtualenvs.in-project true。配合 Dev Container 实战:团队开发环境一次配好 这类可复现方案,本地与远程环境能进一步对齐。

五、打包与发布:从源码到 PyPI

Poetry 把打包和发布也纳入了同一套命令。先 build 生成 sdist 与 wheel,再用 publish 上传,全程无需手写 setup.py。

poetry build                       # 生成 dist/*.tar.gz 与 *.whl
poetry config pypi-token.pypi <TOKEN>
poetry publish                     # 上传到 PyPI
poetry publish --build             # 先 build 再上传
发布方式适用场景命令
TestPyPI 试发验证元数据是否正确poetry publish -r testpypi
正式 PyPI公开库上线poetry publish
私有源公司内部共享poetry config repositories.foo <url>

六、在 CI 与容器中落地

在 GitHub Actions 实战:从零搭建 CI/CD 流水线 里,用 Poetry 安装依赖并发布是最自然的组合。下面这段工作流在打 release 时自动构建并上传到 PyPI。

name: publish
on:
  release:
    types: [published]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: "3.12" }
      - run: pipx install poetry
      - run: poetry install --only main
      - run: poetry build
      - run: poetry publish
        env:
          POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_TOKEN }}

容器化时,利用 Docker 编排 的思路,把 Poetry 装进镜像并只装运行时依赖,能显著减小镜像体积。

FROM python:3.12-slim
ENV POETRY_VERSION=1.8.3 POETRY_VIRTUALENVS_CREATE=false
RUN pip install "poetry==$POETRY_VERSION"
WORKDIR /app
COPY pyproject.toml poetry.lock ./
RUN poetry install --only main --no-root
COPY . .
CMD ["poetry", "run", "python", "main.py"]

七、Poetry 与 uv 怎么选

uv 实战:Python 包管理与虚拟环境极速指南 里的 uv 用 Rust 重写,安装速度比 Poetry 快一个数量级,特别适合追求极速 CI 的团队。Poetry 则胜在稳定、功能完整(依赖组、发布、插件生态成熟)。新项目两者都能选,老项目是否迁移要看团队习惯与收益——如果只是想要更快的 install,uv 的 uv pip 也能渐进替换。

八、常见坑与排障

现象原因解决
安装慢默认源在国外poetry source add 清华/阿里镜像
lock 冲突多人同时改 toml先 pull 再 lock,务必提交 lock
找不到私有包私有源未配置poetry source add 私有源
版本解析失败约束过严放宽区间或 poetry lock –no-update

把 Poetry 接进日常工作流后,依赖一致性、可重现构建和发布效率都会明显提升。建议新项目直接从 poetry new 起步,老项目可以分阶段把 requirements.txt 迁到 pyproject.toml,先享受锁文件带来的确定性,再逐步过渡到完整打包发布流程。

上一篇 RAG 评估实战:用 RAGAS 量化检索增强生成质量
下一篇 TDengine 实战:高性能时序数据库入门与落地
最新评论
Docker 网络模式详解:bridge/host 生产选型 - FSData
Docker 网络模式详解:bridge/host 生产选型 - FSData
8月20日
[…] 注意最后那条:把端口绑定到 127.0.0.1,再由宿主机上的 Nginx 反代进来,比直接 -p 80:80 暴露安全得多,也方便统一做
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
Vue3 + TypeScript 工程化:类型安全的前端架构 - FSData
8月20日
[…] Pinia 的工程化用法,可以参考我们之前的实战文章 《Vue3 组合式 API + Pinia:状态管理从入门到实战》,那里覆盖了 Sto
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
2026 年最值得装的 10 个 VS Code 插件(AI/前端/后端/效率全覆盖) - FSData
8月19日
[…] 状态,点一下就能起停容器,配合我们讲过的 Docker Compose 编排 […]
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
Redis 缓存设计:穿透、击穿、雪崩与最佳实践 - FSData
8月19日
[…] 缓存三大坑的本质都是”缓存失效导致请求穿透到数据库”。记住口诀:穿透用布隆、击穿用锁、雪崩用错峰。配合合理的过期策略
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
GitHub Actions 实战:从零搭建 CI/CD 流水线 - FSData
8月19日
[…] Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI […]