你一定碰到过这种时候,在GitHub上看到一个有趣新模型新项目,开开心心地克隆下来,打开控制台准备大干一场,结果光配置环境就折腾到怀疑人生。挑选python版本,搭建虚拟环境,安装依赖包,然后配置各种工具,就感觉你在各种工具之间反复横跳。而这些根源就在于python生态太过于分散,然而现在随着uv的出现,这个分裂终于有了一个优雅的解决方案。uv将python开发的全流程统统统一在自己的管理下,集成了从安装 Python 版本、创建虚拟环境,到管理依赖、安装独立工具,乃至最终打包发布的所有功能。下面我们就从头到尾走一遍,如何使用uv来说实现python开发。要让一段代码跑起来,通常需要先搞定两个问题:正确的 Python 版本,以及完整的依赖。uv提供了个:uv python list,列出了所有受支持的python版本,甚至还包含pypy和graalpy这些第三方实现。你想要安装特定的版本,可以直接使用命令uv python install cpython-3.12,uv就会自动下载并安装好3.12版本的python。甚至有时候你都不需要提前安装,只需要在uv的命令后面增加一个-p xxx的参数,他就会自动下载对应的版本并执行脚本。主打就是一个任意切换随心所欲。确定好python版本后,就需要安装依赖,我们首先需要在工程中通过uv init -p 3.13,初始化工程,这会在文件夹内生成几个必要文件。其中.python-verison记录了python的版本,可以通过修改该文件切换工程的python版本。而pyproject.toml则是整个项目的配置核心。当我们通过uv add来安装库后,他会自动创建一个虚拟环境,同时将环境的依赖写入到pyproject.toml中。当你用uv命令执行代码时候他会自动激活项目环境,并运行代码。有些工具,可能在项目开发的时候会使用一下,就比如想在写完代码后用ruff检查一下代码的质量。一种做法就是通过通过uv add添加--dev参数,将ruff作为开发依赖而不是发布依赖,来避免发行时包含。但这有个问题就是你需要基于项目环境才能使用这个工具。同时开发工具本身与代码无关,集成在项目中总是让人别扭。于是有了第二种方法uv tool install ruff, uv 会把 ruff 当成一个系统级的独立工具来安装,为它单独创建一个隔离的虚拟环境。这样一来,ruff 既可以在整个系统中随时调用,又完全不会和任何项目的依赖发生冲突。我们也可以使用uv tool list来查看所有已经安装了的工具。项目开发完毕,需要分享的时候,只需要在pyproject.toml里添加一个[project.scripts],在里面你可以指定一个命令,并给他配置对应的入口函数。之后你再执行uv build,一个wheel包就生成完毕了,其他人就可以通过uv tool install或者uv add来安装和使用这个项目了。可以看到当我们安装了我们生成的包后,可以直接输入我们指定的命令test,我们的代码就可以像内置命令一样运行起来了。而且它自带独立的虚拟环境,和你当前的开发目录彻底解耦,干净利落。从上面简单的示例可以看到,uv能够用一套统一的命令语法来完整管理python开发,从而给python项目开发构建了一条完整而又清晰的工作流。所以如果你被python环境配置劝退过不止一次,那么我觉得你可以尝试去使用uv。
这个讲述一下如何通过uv配置pytorch,因为pytorch有多种加速库,所以直接使用uv命令,他会默认安装cpu版本。最快的方法是直接使用uv pip install,你可以使用和之前一样的指令来安装,但这样就无法充分发挥uv自动化的能力。所以一般我们是通过在pyproject.toml文件中指定torch的源,配置相应的源地址,然后再使用uv sync指令,就可以实现指定的pytorch版本安装。[project]name = "scribe"version = "0.1.0"description = "Add your description here"readme = "README.md"requires-python = ">=3.12"dependencies = [ "torch>=2.6.0", "torchvision>=0.21.0",][tool.uv.sources]torch=[ {index="pytorch-cu126"},]torchvision=[ {index="pytorch-cu126"},][[tool.uv.index]]name="pytorch-cu126"url="https://download.pytorch.org/whl/cu126"explicit=true