这两年折腾 AI 开源项目,一个很明显的变化是:
电脑里的 Python 环境越来越多了。
这个项目要求 Python 3.10,那个项目要求 3.11,新一点的模型开始要求 3.12。
然后你的电脑里可能同时存在:
最后最常见的问题不是代码跑不起来,而是:
python --version
which python
which pip
看完之后开始怀疑人生:
我现在到底用了哪个 Python?
如果经常折腾 AI、Hugging Face、Whisper、TTS、Stable Diffusion 之类的项目,我建议至少搞清楚两套方案:
传统稳定方案:pyenv + venv
新项目方案:uv
我现在更推荐:老项目不折腾,新项目优先 uv。
一、先说最稳的:pyenv + venv
这套方案最大的优点就是:
职责非常清晰。
pyenv 只负责一件事情:
管理 Python 版本
venv 只负责:
创建项目虚拟环境
Python 官方的 venv 本身就是用来创建相互隔离的 Python 环境,而 pyenv 官方也明确把自己的定位放在 Python 多版本切换上。
例如一个项目需要 Python 3.12:
pyenv install 3.12.14
进入项目:
cd my-project
指定当前目录使用 Python 3.12:
pyenv local 3.12.14
这时目录下会出现:
.python-version
然后创建虚拟环境:
python -m venv .venv
激活:
source .venv/bin/activate
Windows:
.venv\Scripts\activate
安装依赖:
pip install torch
pip install transformers
pip install yt-dlp
整个关系非常简单:
pyenv
↓
Python 3.12
↓
venv
↓
.venv
↓
pip install
如果项目已经稳定运行,我其实不建议为了追新工具强行迁移。
pyenv + venv 最大的优势就是简单、透明、出了问题知道去哪里找。
二、但新项目,我更建议直接用 uv
uv 是 Astral 推出的 Python 包管理和项目管理工具,使用 Rust 编写。
它有意思的地方不是简单替代 pip。
而是把过去散落的很多工具整合到了一起:
Python 版本管理
虚拟环境
pip
依赖管理
依赖锁定
项目管理
命令运行
都可以交给 uv。官方目前也直接支持 Python 版本安装、项目环境、依赖锁定以及 uv run 等完整工作流。
以前:
pyenv
+
venv
+
pip
+
requirements.txt
现在可以变成:
uv
这才是它真正吸引人的地方。
三、安装 uv
macOS / Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
这是 uv 官方提供的安装方式之一。
安装完成:
uv --version
然后就可以开始用了。
四、用 uv 创建一个 Python 3.12 项目
假设我要创建一个 AI 项目:
uv init ai-demo
uv init 会直接初始化一个 Python 项目。
进入目录:
cd ai-demo
指定 Python 3.12:
uv python pin 3.12
如果本机没有 Python 3.12,可以直接:
uv python install 3.12
也就是说,以前需要:
pyenv install 3.12
现在 uv 自己也能处理 Python 版本。
接下来安装依赖。
以前:
pip install transformers
现在:
uv add transformers
例如:
uv add transformers torch
开发依赖:
uv add --dev pytest ruff
官方推荐在项目模式下通过 uv add 管理依赖,而不是手动向 .venv 里安装包。
你会看到几个关键东西:
ai-demo/
├── .python-version
├── .venv/
├── pyproject.toml
├── uv.lock
└── main.py
其中:
.python-version
控制 Python 版本。
pyproject.toml
记录项目以及依赖声明。
uv.lock
记录精确的依赖版本。
.venv 则仍然是熟悉的虚拟环境。
所以 uv 并没有抛弃虚拟环境。
它只是把虚拟环境自动管理起来了。
五、运行项目甚至不用 activate
传统方式:
source .venv/bin/activate
python main.py
uv 可以直接:
uv run python main.py
甚至很多时候你根本不需要关心:
source .venv/bin/activate
uv run 会检查项目环境;如果环境不存在或者依赖发生变化,会确保项目环境处于正确状态。
例如:
uv run python main.py
测试:
uv run pytest
运行脚本:
uv run app.py
这个体验对经常切换多个 AI 项目的人特别舒服。
六、最常用的 uv 命令,其实就几个
创建项目:
uv init my-project
安装 Python:
uv python install 3.12
指定项目 Python:
uv python pin 3.12
添加依赖:
uv add transformers
删除依赖:
uv remove transformers
同步环境:
uv sync
运行程序:
uv run python main.py
实际上日常开发记住这几个就已经够用了。
七、怎么从 pyenv + venv 切换到 uv?
如果你已经有一个老项目:
project/
├── .venv/
├── requirements.txt
└── main.py
首先看有没有:
requirements.txt
有的话非常简单。
先退出旧环境:
deactivate
如果确认依赖已经完整记录,可以删除旧环境:
rm -rf .venv
然后:
uv init
指定 Python:
uv python pin 3.12
把原来的依赖导入:
uv add -r requirements.txt
uv 官方已经支持直接从 requirements.txt 导入依赖。
最后:
uv sync
以后运行:
uv run python main.py
就可以了。
八、没有 requirements.txt 怎么办?
很多老项目就是:
pip install xxx
pip install xxx
pip install xxx
装了一堆,根本没记录。
这种情况下先在旧环境里:
pip freeze > requirements.txt
然后:
deactivate
再迁移:
rm -rf .venv
uv init
uv python pin 3.12
uv add -r requirements.txt
uv sync
不过这里有一个细节:
pip freeze 会把直接依赖和间接依赖全部导出来。
所以它适合迁移救急,但迁移完成以后最好再整理一下 pyproject.toml,只留下真正需要的直接依赖。
九、如果原来已经有 pyproject.toml
那就不要再:
uv init
因为 uv init 遇到已经存在的 pyproject.toml 会退出。
通常直接:
uv sync
然后:
uv run python main.py
即可逐渐把项目切到 uv 的工作流。
十、我现在会怎么选?
我的原则非常简单。
已经稳定运行的老项目
继续:
pyenv + venv
没必要为了工具升级而升级。
新的普通 Python 项目
直接:
uv
新的 AI 项目
我现在也会优先:
uv
尤其电脑里同时存在 Python 3.10、3.11、3.12,各种 Transformers、Whisper、TTS、PyTorch 项目时,uv 的体验会明显舒服很多。
最后
以前我们创建一个 Python 项目,脑子里要同时记住:
Python 从哪里来?
当前到底是什么版本?
venv 创建了吗?
activate 了吗?
pip 是哪个 pip?
requirements.txt 更新了吗?
uv 做的事情,本质上就是把这些东西重新收拢到一个项目工作流里。
以前:
pyenv local 3.12
python -m venv .venv
source .venv/bin/activate
pip install transformers
pip freeze > requirements.txt
python main.py
现在:
uv init
uv python pin 3.12
uv add transformers
uv run python main.py
少折腾环境,才能把时间真正花在代码和模型上。
如果你最近准备开始一个新的 Python / AI 项目,uv 很值得直接试一次。