这是一篇关于 Python 项目依赖管理的文章,主要内容如下:
- 如何引发火灾(How a fire starts):通过一个编写 Python 脚本的例子,引出依赖管理的重要性。最初代码运行良好,去露营后代码演变为多个脚本和库,他人使用时却出现问题,最后因安装新包导致环境崩溃。强调 Python 依赖管理的复杂性,就像在干燥的森林中露营可能引发大火一样。
- 什么是依赖(What are dependencies):定义依赖为使代码按预期运行所需的外部内容,可分为项目特定包、系统包、操作系统、硬件和环境等多层。指出简单脚本往往依赖复杂的系统和环境,开发时容易忽略这一点。
- 为什么要“管理依赖”以及这意味着什么(Why should we "manage dependencies" and what does that even mean):管理依赖的关键原因是可重复性,包括开发、构建和部署阶段。良好的依赖管理意味着明确声明和跟踪所有阶段的依赖,有自动化流程将声明的依赖转换为工作环境,并能安全地更新环境。
- 管理依赖的最佳方法是什么(What is the best way to manage dependencies):管理依赖的两个先决条件是版本控制和环境隔离。通过创建定义文件、生成锁定文件、同步环境并在版本控制中跟踪这两个文件来实现可重复的环境。但这种方法不能解决所有依赖问题,Python 的默认工具在依赖管理方面存在不足。
- 为什么在 Python 中管理依赖很困难(Why is managing dependencies in Python hard):默认工具不鼓励最佳实践,系统软件和项目包问题导致需要额外工具,生态系统碎片化使得选择工具困难,许多第三方工具本身也是用 Python 编写,增加了依赖管理的复杂性。
- 可用的 Python 工具(Available tooling for Python):介绍了 pip、venv、virtualenv、pip-tools、Pipenv、Poetry、PDM、pyenv、pipx、uv、Conda、Mamba、conda-lock 和 Pixi 等工具的功能、优点和缺点。pip 是默认的包管理器,速度快但缺乏锁定文件;venv 和 virtualenv 用于创建虚拟环境,但有局限性;pip-tools 引入了锁定文件机制;Pipenv 结合了多个功能;Poetry 功能全面但有局限性;PDM 类似于 Poetry;pyenv 用于安装和管理 Python 版本;pipx 用于在用户级别安装 pip 包;uv 是一个全能的工具,速度快且跨平台;Conda 用于安装各种软件和库,管理虚拟环境;Mamba 是更快的 Conda 替代品;conda-lock 用于管理 Conda 环境的锁定文件;Pixi 类似于 uv 但用于 Conda 生态系统。
- 大多数工具的元问题:自我版本(Meta-issue of most tools: self-versions):大多数工具没有考虑自身旧版本和新版本之间的兼容性问题,导致用户在使用过程中可能遇到困难。
- Python 生态系统之外的工具(Tooling beyond the Python ecosystem):介绍了容器(如 Docker)和 Nix 两种语言无关的工具。容器是用于部署服务的标准工具,可隔离环境,但构建和推送容器麻烦;Nix 是一种注重可重复性的包管理器,语言复杂,社区较小,但能保证环境的一致性。
- 你应该使用什么(What should you use):根据不同的场景,如是否是系统管理员、是否需要复杂依赖等,给出了不同的工具推荐。对于大多数 Python 项目,推荐使用 uv;在某些特定情况下,如需要维护多个相互不兼容的环境,可使用 pip + venv + pip-tools 或 pyenv / pyenv-win;对于非管理员且需要复杂依赖的情况,推荐使用 Pixi。
总之,Python 项目依赖管理复杂,不同工具各有优缺点,应根据具体情况选择合适的工具。未来,工具如 uv 和 Pixi 可能会取代其他工具,但在某些情况下,简单工具仍有其用途。同时,还讨论了 Nix 和容器在创建可重复和隔离环境方面的作用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。