使用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 -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

uv python install 3.13
  1. 项目创建
uv init
  1. 向项目中增加包
uv add <package-name>
  1. 添加全局工具
uv tool install <package-name>
  1. 在项目中运行
uv run script.py

uv run <package-tool>


  1. 这是一个简单写法,更通用的是: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 。 ↩︎