原文
(由 DeepSeek 辅助翻译)
(警告,这是一篇长文。我有点写嗨了。)
经过一年时间,在许多客户项目中尝试使用 uv,这个由 Astral 推出的新 Python 项目管理工具,我看到了它的优点和不足。
我的结论是:如果你的情况允许,总是先尝试 uv。如果不行,再退回到其他工具。
它是帕累托解决方案,因为比起费劲去弄清楚该用什么工具,uv 更容易上手,而且你很少会后悔。实际上,迁移到 uv 和从 uv 迁移回来的成本都很低,但它带来的价值却相当高。
虽然这篇文章会深入探讨为什么如此,但我们也会专门讨论什么时候你不想使用 uv。
不过,这篇文章并不是关于如何使用 uv 的教程。后续会有一篇专门的文章。
尽管我对 uv 充满热情,但我坚持认为,在没有看到它在各种工作场景中的表现之前,我不能轻易推荐它。
这是因为 Python 社区庞大且多样化。有学生、数据科学家、AI 开发者、Web 开发者、系统管理员、生物学家、地理学家、插件作者……他们可能在大学、政府机构、初创公司、军队、实验室或大公司工作。
他们的技能水平、经验、环境和约束各不相同,而工具的普适性越强,我就越能推荐它。
这与 PHP、JS、Java 或 Ruby 的情况非常不同。相对来说,很少有人用 Java 开发 X-plane 插件,用 Ruby 编写 GIS 脚本,用 JS 编写银行定价引擎,或用 PHP 作为最新 LLM 模型的主包装。这些语言虽然也能做到,但我看到 Python 的应用范围更广。
因为我是一名自由职业开发者,同时也是一名培训师,我经常在这些领域游走,而且我见过其他工具在这些场景中惨败的情况。pyenv、poetry、pipenv、pdm、pyflow、pipx、anaconda……
事实上,我的博客之所以开始受欢迎,是因为一篇文章:为什么不告诉人们“简单”地使用 pyenv、poetry、pipx 或 anaconda
所以我不想给人们虚假的希望,推荐一些只在我的小圈子里有效的东西,不幸的是,大多数极客都会这么做。
现在,我已经看到了 uv 的使用方式和它可能遇到的问题,我不仅可以告诉你应该使用它,还可以告诉你为什么。
当然,我也会告诉你什么时候不要使用它。
我反复强调过,Python 的引导过程是所有问题的根源。所谓引导,指的是安装 Python 本身,以及配置一个新项目,以便后续安装依赖或构建包。你之后遇到的许多问题(例如打包问题)实际上都源于此。
这是因为:
- Python 有很多不同的安装方式,每种方式都有不同的默认设置和陷阱。而且这些还因操作系统而异。
- 光是安装 Python,就需要了解很多前置知识,而 Python 是一门特别适合初学者的语言,而初学者,顾名思义,并不具备这些知识。
- Python 的应用场景非常广泛,因此很难创建“一个教程适用所有情况”。在公司锁定的 Windows 机器上提供的 Python 体验,与在 Debian 爱好者笔记本电脑上的体验完全不同。
- 很少有人能给出关于这方面的好建议,但每个人和他们的猫都会以权威的语气谈论它。网上关于这方面的废话实在太多了。
- 有很多工具试图解决这个问题,因此我们现在面临着选择悖论。
PATH、PYTHONPATH、糟糕的命名约定、在同一台机器上安装多个 Python 版本、Linux 上的可选包,以及 Python 作为系统依赖项,这些都为你提供了无数种搬起石头砸自己脚的方式。
-m 和 py 在它们的使命中失败了。大多数人甚至不知道它们的存在。
- 编译扩展的流行给这一切增加了不少乐趣。
- 人们会遇到直接与这些问题相关的问题,但完全不知道原因,因此他们会直接说“Python 打包太烂了”,因为他们会把问题归咎于他们正在使用的工具,而不是他们根本不知道的根源问题。
因此,一个好的 Python 项目管理工具应该具备以下特性:
- 独立于 Python 的引导过程,因此不会出现鸡生蛋蛋生鸡的问题,同时也能绕过
PATH 和 PYTHONPATH 问题。
- 能够在所有平台和情况下以统一的方式安装和运行 Python。
- 在基础工具(
pip 和 venv)与自身之间提供桥梁。
- 拥有非常强大的依赖解析器。
- 让简单的事情变得简单(安装东西),让复杂的事情变得可能(在不同于开发环境的操作系统上安装锁定依赖)。
- 所有这些都要易于安装和使用,当然,还要足够可靠,让你放心地将它用于你技术栈中最重要的部分之一。