# 使用UV管理Python


上周三下午，办公室里安静得只有空调的低鸣。我路过小王的工位，看到她正把一份Excel表格里的数据，一列一列地复制到浏览器里的某个对话框里。那个对话框的界面很简洁，一个输入框，下面有几个功能按钮。她选中、复制、粘贴，然后敲下回车，屏幕上立刻开始滚动出分析结论。

我停下来看了一眼。那份表格的标题里写着Q3客户明细，里面是公司最敏感的那批客户数据。

她抬起头，注意到我在看，有点不好意思地笑了笑，说，这个工具分析得挺准的，比我自己做透视表快多了。

我没说什么，只是点了点头，然后走回自己的座位。坐在椅子上，我看着屏幕上的终端窗口，那里面正在跑一个我本地写的Python脚本。同样的数据，在我这里只是一行命令的事。但我完全理解她为什么那么做。PowerShell、终端、Python环境配置，这些词对她来说，大概和某种古老的巫术差不多。

不是她不够聪明。恰恰相反，她是一个非常聪明的数据分析师。只是，在这个行业里，有一个巨大的鸿沟，把会用代码处理数据和不会用代码处理数据的人，分成了两个世界。而跨越这条鸿沟的桥，过去一直修得又窄又陡。

很多人一提到在本地跑Python，脑子里立刻浮现的是一堆噩梦般的画面。下载Python安装包，勾勾选选一堆看不懂的选项，然后装完了发现 pip 找不到，或者装了包之后项目A能用项目B却崩了。再然后去搜教程，教程里告诉你需要用虚拟环境，于是你又开始学 venv、conda、pyenv，每个工具都有自己的一套术语，每个工具都号称自己是最好的。

我以前也在这个迷宫里转了很久。我记得我第一次尝试配置一个稳定的Python开发环境，花了整整两个下午。那天傍晚，我对着满屏的错误信息，有一种强烈的想把电脑扔出窗外的冲动。那种挫败感，我到现在都记得。

所以后来有了各种各样的AI数据分析工具，大家蜂拥而上，我完全理解。你不需要装任何东西，打开浏览器就能用，而且效果真的很惊艳。你把数据扔进去，它不仅能分析，还能画图，还能写结论，速度比你自己做快十倍。

但问题也就在这里。

你的数据，离开了你的电脑。它穿过了网线，去了某个你根本不知道在哪里的服务器。那些客户的姓名、联系方式、交易金额，在某个遥远的数据中心里，被存储、被处理、被用来训练模型。你和那个服务器之间，隔了无数个你控制不了的环节。合同上也许写了隐私保护条款，但数据一旦离开本地，它就不完全属于你了。

这不是在说那些AI工具不可信。只是，作为一个处理敏感数据的人，你心里总得有个数。

我一直在想，有没有一种办法，能让像小王这样的人，不需要经历我当年那两个下午的折磨，就能在本地跑起Python，处理自己的数据。

直到我遇到了 uv。

第一次听说 uv 的时候，我其实是有点怀疑的。又一个Python包管理工具？这个领域里的工具已经够多了，真的还需要一个吗？但我还是试了一下。结果，怎么说呢，有点出乎意料。

uv 是 Astral 这个团队做的东西，同一个团队还做了 ruff，就是那个飞速的Python代码格式化工具。但 uv 的目标比 ruff 大得多，它想做的事情，用一句话说，就是把 Python 环境里所有让人头疼的环节，全部用一个工具搞定。

安装 uv 的过程，简单得有点不真实。你打开 Windows 的 PowerShell，只需要复制一行命令，粘贴进去，回车。十几秒之后，它就装好了。没有勾勾选选的安装向导，没有让你配置环境变量的弹窗，它自己就悄悄地把一切安排妥当。那行命令是这样的， `irm https://astral.sh/uv/install.ps1 | iex` [^1]，你甚至不需要知道它具体做了什么，它就像那种一键安装的脚本，默默在背后把所有事情理顺。

我第一次给同事演示这个的时候，她看着那个黑色的终端窗口，里面几行白色的字闪过，然后一切归于平静。她问，这就完了？我说，对，这就完了。她愣了一下，说，比我想象中快太多了。

这个反应，我后来见了太多次。大家想象中的配置开发环境，一直是一个又漫长又痛苦的过程。但 uv 把这个印象彻底打破了。

装好了 uv 之后，你可以让它帮你安装 Python 本身。你只需要敲 `uv python install 3.12` ，它就会把 Python 3.12 的最新版本下载下来，放到一个它自己管理的目录里。你不需要去 Python 官网找下载链接，不需要担心你电脑上已经装了另一个版本的Python会不会冲突。它就像一个非常称职的管家，把每个版本的Python都分门别类地放好，你随时可以调用。

然后是项目。以前你想为一个新的数据分析项目创建一个独立的Python环境，你需要学 venv，需要记住一长串命令。现在你只需要进入你的项目文件夹，敲 `uv init` ，uv 会为你创建一个 `pyproject.toml` 文件，这是现代 Python 项目的标准配置文件。然后你敲 `uv add pandas` ，它会把 pandas 这个数据分析库装到你的项目里，同时把依赖关系写进那个配置文件。

如果你想运行一个 Python 脚本，比如 `analysis.py` ，你不需要先激活什么虚拟环境，直接敲 `uv run analysis.py` 就行了。uv 会自动检测你的项目依赖，如果缺了什么，它会帮你补上，然后执行脚本。这就像你有一辆智能汽车，你不需要知道引擎怎么点火，你坐上去，按启动键，它自己就跑了。

uv 最让我感到舒服的地方，是它的速度。它用 Rust 写的，安装包的速度比 pip 快得不是一点半点。以前 `pip install` 一个数据分析的常用环境，可能要等几分钟，去倒杯水回来还没装完。uv 基本上是秒级的。这个速度上的差别，你用一次就能感受到。

说到这里，我得吐槽一下。其实 uv 也不是没有缺点。它的文档，坦白讲，有时候写得不够细。你遇到一些边缘情况，可能需要去翻它的 GitHub issue 才能找到答案。而且它的命令虽然简单，但如果你对 Python 环境完全没有概念，一开始还是会有些懵。比如你可能会问，它装的Python到底放在哪了？我能不能直接在终端里敲 python？这些问题，确实需要一点时间来适应。

不过，一旦你过了那个最初的适应期，后面的路就非常顺畅了。

我现在帮同事搭建本地数据分析环境，基本上是一个标准流程。打开 PowerShell，一行命令装 uv，然后 `uv python install 3.12` ，然后 `uv init` 项目，然后 `uv add pandas numpy matplotlib jupyter` 。整个过程，从空白的电脑到能跑起 Jupyter Notebook 的本地环境，大概也就十分钟。而在这十分钟里，大部分时间是花在下载包上，你需要做的操作，其实就那几行命令。

Jupyter Notebook 是数据分析领域非常常用的一种交互式编程环境。你可以在浏览器里写代码、运行代码、看结果，非常直观。以前装 Jupyter 是一件很麻烦的事，各种依赖关系很容易搞混。现在用 uv，只需要 uv add jupyter，然后 `uv run jupyter notebook`，本地浏览器就会打开一个页面，你就可以开始写代码分析了。

想象一下这个场景。你有一份数据，不再需要复制粘贴到某个网页对话框里。你打开本地的 Jupyter Notebook，把数据读进来，用 pandas 做清洗，用 matplotlib 画图，所有操作都在你自己的电脑里完成。没有任何数据离开你的本地硬盘。你甚至可以断开网络，继续工作。

我有时候会在高铁上打开笔记本，没有网络，照样能分析数据。那种感觉，像是拥有了一个完全属于自己的小世界。

这种掌控感，是在云端工具里很难体会到的。

而且，一旦你掌握了这种本地工作的能力，你会发现你的效率其实更高。因为 AI 工具虽然能快速给你结论，但它的过程是不透明的。你不知道它是怎么分析出那个结果的，它可能用错了某个指标，或者误解了某个字段的含义，你很难察觉。而当你自己在本地写代码做分析时，每一步都是你自己控制的。你清洗了哪些数据，用了什么统计方法，画了什么样的图，一切都清清楚楚。这不仅是数据安全的问题，更是分析质量的问题。

当然，我并不是在说所有人都应该立刻抛弃 AI 工具，全面转向本地代码。那太极端了。AI 工具在某些场景下仍然非常有价值，比如你想快速探索一个数据集，或者你需要一些灵感和方向。我觉得理想的状态是，你有选择。你可以根据数据的敏感度，根据任务的复杂程度，决定是在本地处理还是借助云端工具。而 uv 做的，就是把本地处理这个选项的门槛，降到了前所未有的低。

写到这里，我突然想起自己第一次用 Python 做数据分析的经历。那是很多年前，我在某个项目里，需要分析一组总共4G的数据。说实话，我那时候是会写代码的，Haskell、R、Fortran 都在我的工具箱里。但面对这4G的数据，Haskell 无论如何都无法快速写出我想要的分析逻辑，R 倒是能写，但慢得让我怀疑电脑是不是坏了。Fortran 也还行，但不好绘图，我甚至一度用 Excel 做数据，然后用 PPT 来画那些图。我死磕了很久，整个人都有些疯批了。

后来一个同学看不下去了，说你别这么死磕 R 了，试试 Python 吧。我想想，也行，就磕磕绊绊地开始学。用最直白的逻辑，写了一堆谈不上什么优雅的代码，但跑起来居然几分钟就完成了分析，还输出了我需要的结果。那一刻我是真的很兴奋，那种突然解放的感觉，我到现在都记得。也是那时候，我第一次切身体会到了，Python 在处理这种体量的数据时，确实比 R 顺手太多了。

我后来花了很多时间，去进一步学习 Python。但现在回想起来，如果当时有一个像 uv 这样的工具，也许我在学 Python 的时候，不会被环境配置的问题绊住那么久。环境的门槛，有时候比编程本身更能劝退人。

后来有一天，小王又拿着一份数据来找我。这次我没让她复制粘贴到任何地方。我打开她的电脑，打开 PowerShell，敲了几行命令。十分钟后，她本地的 Jupyter Notebook 已经打开了。我教她把数据文件拖进去，教她写了第一行 Python 代码， `pd.read_csv` 。数据读进来的一瞬间，她看到表格整齐地展现在眼前，那种表情，和我很多年前第一次用 Python 跑完那4G数据分析的时候，一模一样。

不是所有人都需要变成程序员。但是，如果你每天的工作都和数据打交道，能够掌握一点本地处理数据的能力，就像是给自己多开了一扇门。你可以选择相信云端的服务，但你也拥有了不依赖它们的能力。

uv 这个东西，对我来说，最大的意义不在于它有多快，或者它的技术有多先进。它最大的意义在于，它让在本地运行Python这件事，从一个需要专业知识才能完成的任务，变成了一个普通人复制粘贴几行命令就能做到的事。

它拆掉了那道门槛。

工具最终要回答的，从来不是技术问题，而是人的问题。

当一道门槛高得让人望而却步的时候，大多数人会自然而然地选择绕过它。而云端AI工具，就是那个绕行的通道。它提供了便利，但也在某种程度上，让人交出了自己的一部分主权。

uv 做的，只是把那道门槛削平了一点。但它削得足够平，平到很多人第一次发现，原来自己也可以站在门槛的这一边。

那天傍晚，办公室又安静下来了。小王的工位上，终端窗口和 Jupyter 浏览器并排开着。她还在摸索，还在试错，但数据和代码，都在她自己的电脑里。

我站在她身后看了一会儿，没有打扰她。

那份被复制粘贴到云端对话框的数据，现在安安静静地躺在本地文件夹里。它不再是一串被上传又下载的比特，而是变成了一行可以被读取、被分析、被理解的代码。

外面的世界，那些提供便利的云端服务，还在那里。

但此刻，她有了自己的选择。

这大概就够了。

-----

最后的最后，如果你只想了解uv的安装和最简单的使用，那么，这点儿压缩饼干应该就是你要的了。

1. 安装：适用性更广的方式

```powershell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

uv python install 3.13
```

2. 项目创建

```powershell
uv init
```

3. 向项目中增加包

```powershell
uv add <package-name>
```

4. 添加全局工具

```powershell
uv tool install <package-name>
```

5. 在项目中运行

```powershell
uv run script.py

uv run <package-tool>
```

-----

[^1]: 这是一个简单写法，更通用的是： `powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"` 。

