news 2026/6/9 22:30:35

Poetry

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Poetry

1. Poetry是什么?

可以把Poetry理解为一个“项目管家”。传统Python项目里,管理依赖(第三方库)、虚拟环境、打包和发布等事务,通常需要组合使用多个工具(如pip, virtualenv, setuptools, twine等),并且手动维护多个配置文件(如requirements.txt, setup.py, MANIFEST.in等)。这个过程容易出错,也比较繁琐。

Poetry将这些工作统一起来,用一个工具和一份核心配置文件(pyproject.toml)来管理。它通过一个叫pyproject.toml的文件来声明项目的所有元信息、依赖以及构建配置,确保项目的依赖解析、安装、打包和发布过程是确定、一致且高效的。类似于一个家庭药箱,之前你需要分别购买感冒药、创可贴、消毒水,并自己记住用法和有效期;现在Poetry提供了一个整理好的急救箱,里面物品分门别类,并有清晰的使用说明清单。

2. 他能做什么?

Poetry主要解决以下几个核心问题:

  • 依赖管理与解析:这是Poetry最突出的能力。它能自动计算并锁定项目所有依赖(包括间接依赖)的精确版本,解决版本冲突,并生成一个“锁文件”(poetry.lock)。这确保了在任何地方、任何时候安装的依赖都是一模一样的,避免了“在我机器上能运行”的问题。就像一个精确的食谱,不仅列出了主料,还锁定了所有调料品牌和批次,保证每次做出的味道完全一致。

  • 虚拟环境管理:Poetry可以自动创建和管理与项目关联的Python虚拟环境,将项目依赖与系统Python或其他项目完全隔离。就像一个独立的厨房,不会和其他项目的“食材”混在一起。

  • 打包与发布:用简单的命令就能将项目打包成标准的发行版(源码包或wheel包),并轻松发布到PyPI(Python官方的软件仓库)或私有的仓库。以前需要写复杂的setup.pyMANIFEST.in文件,现在大部分配置在pyproject.toml里声明即可。

  • 项目结构标准化:它鼓励并帮助创建符合现代Python项目标准的结构。

3. 怎么使用?

一个典型的工作流如下:

  1. 安装Poetry:通常推荐使用官方提供的安装脚本进行独立安装,不污染项目环境。

    bash

    curl -sSL https://install.python-poetry.org | python3 -
  2. 创建新项目

    bash

    poetry new my-project cd my-project

    这会创建一个包含标准目录结构(如my_project源码目录和tests测试目录)和初始pyproject.toml文件的项目。

  3. 初始化现有项目

    bash

    cd existing-project poetry init

    通过交互式问答生成pyproject.toml文件。

  4. 添加依赖

    bash

    poetry add requests poetry add pytest --dev # 添加开发依赖

    add命令会自动更新pyproject.toml并安装依赖(如果需要,会先创建虚拟环境)。

  5. 安装所有依赖

    bash

    poetry install

    这条命令会读取pyproject.tomlpoetry.lock(如果存在),安装所有项目依赖和开发依赖到虚拟环境中。如果是第一次安装且没有锁文件,它会解析依赖并生成poetry.lock

  6. 在项目环境中运行命令

    bash

    poetry run python your_script.py poetry run pytest
  7. 打包与发布

    bash

    poetry build # 生成dist/目录下的包 poetry publish # 发布到PyPI(需要提前配置token)

4. 最佳实践

  • poetry.lock文件纳入版本控制:这是保证团队协作和环境一致性的关键。对于应用程序(非库),务必提交锁文件。对于要发布的库,通常只提交pyproject.toml,不提交lock文件,以便让库的使用者能灵活解析依赖。

  • 使用明确的依赖版本声明:在pyproject.toml中,可以使用Caret(^)或Tilde(~)等符号来指定兼容的版本范围(如^2.0.0表示兼容2.x的最新版),让Poetry在更新时有合理的灵活性,同时又通过lock文件锁定具体版本。

  • 区分生产依赖与开发依赖:使用--dev标记(或在新版Poetry中用--group dev)来添加仅用于开发、测试的包(如pytest, black, mypy等),使生产环境更干净。

  • 保持pyproject.toml整洁有序:手动编辑该文件时,将依赖分类(如[tool.poetry.dependencies],[tool.poetry.group.dev.dependencies])整理清楚,便于阅读和维护。

  • 优先使用poetry add命令:添加依赖时尽量使用poetry add而非手动编辑pyproject.toml,因为该命令会自动处理版本解析和安装。

5. 和同类技术对比

  • pip+virtualenv/venv+requirements.txt

    • 这是最传统、最底层的方式。pip是包安装器,但依赖解析能力较弱。requirements.txt需要手动维护,且通常只记录直接依赖的版本,难以保证复杂依赖树的一致性。整个过程更手动化,工具链分散。

    • 对比:Poetry提供了一个集成化的、更高层的解决方案,自动处理了依赖解析、锁版本和虚拟环境管理,体验更流畅、结果更确定。

  • pipenv

    • pipenv的目标与Poetry非常相似,也是致力于统一依赖管理和虚拟环境,并生成Pipfile.lock锁文件。它曾获得Python官方推荐。

    • 对比:Poetry在依赖解析算法上通常被认为更快、更现代。此外,Poetry将打包和发布功能也集成在内,而pipenv主要聚焦于依赖安装和环境管理。近年来,Poetry的社区活跃度和采纳率似乎更高。

  • conda

    • conda是一个跨语言的包和环境管理器,起源于科学计算领域。它不仅可以管理Python包,还能管理非Python的二进制库(如MKL, CUDA)。

    • 对比:Poetry是纯Python生态的工具,更轻量,与PyPI集成更紧密。如果项目严重依赖科学计算栈或需要严格管理二进制依赖,conda可能是更好的选择。对于大多数通用的Python应用和库开发,Poetry更简洁直接。

总结来说,Poetry适合追求开发体验一致性、希望简化项目配置和发布流程的Python开发者。对于新项目,它是非常值得推荐的起点工具。对于已有复杂历史配置的旧项目,迁移可能需要一些评估和调整。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 12:55:55

小论文/大论文必备 | YOLO多模态目标检测、绘制曲线对比图 | 引入多种绘制曲线对比图,包括mAP0.5,mAP0.5:0.95,Loss损失变化的曲线对比

一、本文介绍 本文围绕目标检测模型 YOLO多模态 的训练过程与性能评估,重点通过多种曲线图可视化对比方法,系统呈现模型在训练阶段的关键指标变化趋势,深入分析其检测精度与损失优化表现。 本文目录 一、本文介绍 检测精度曲线图 损失函数变化曲线图 二、YOLO多模态 绘…

作者头像 李华
网站建设 2026/6/9 19:50:18

《YOLO多模态创新改进专栏目录 》全网独家创新,多模态融合改进教程,包含早期融合、中期融合、后期融合、损失函数改进、二次创新模块、独家创新等几百种创新点改进,答疑群提供完整项目,永久更新中

🔥《YOLO 多模态创新改进专栏》🔥 🚀创新改进点均来自最新顶会顶刊论文、个人经验总结、多种改进策略、高效发论文🚀 🔥订阅专栏后!享最新前沿创新改进,高效涨点发论文,顺利毕业!🔥

作者头像 李华
网站建设 2026/6/8 9:20:53

当暴雪来袭:软件系统的容错启示录

引言:白色灾难的数字化映射2025年末席卷华北的世纪暴雪导致交通瘫痪、电网崩溃、物流中断。这场持续96小时的极端天气事件,恰似一次对现代城市运行系统的全链路压力测试。当我们复盘供电网络崩溃的三级连锁故障时,软件测试从业者敏锐地发现&a…

作者头像 李华
网站建设 2026/6/6 16:15:51

文化事件嫁接:本地化测试中的敏感场景处置方法论

一、文化事件嫁接的测试学定义 在本地化测试范畴中,文化事件嫁接特指将源语言文化背景中的特定元素(如节日符号、历史隐喻、社会习俗)迁移至目标文化环境时产生的认知冲突现象。2025年Forrester调研显示,78%的跨国数字产品本地化…

作者头像 李华
网站建设 2026/6/9 21:34:38

Android 15 ServiceManager与Binder服务注册深度解析

引言 在上一篇文章中,我们深入分析了Binder驱动的内核机制。但是有一个核心问题还没有回答:Client如何知道Server的Binder句柄? 想象一下,你想打电话给朋友,但你不知道他的电话号码。这时你需要查电话簿(Yellow Pages)。在Android系统中,ServiceManager就是这本"电话簿…

作者头像 李华