一、遇到的问题
自己在做AI开发的时候,先用的conda来管理虚拟环境,然后使用pip freeze > reqiurments来打包相关依赖。
优点,conda环境可以让不同的项目有单独的虚拟环境,不会干扰每个项目,还可以多个项目共享一个conda环境。
缺点:
1.项目一旦大的话,python最麻烦的就是环境依赖,本来自己安装的核心依赖就30个,但是每个库又依赖别的子库,这样下来就有几百上千个依赖,非常麻烦。
2.如果只删除主依赖,比如fastapi。但是它的其他子依赖不会被删除。
3. 别人使用你的项目,不知道你的python版本号,你自己也可能会忘记,需要写在README.MD中记录。
二、UV和pyproject.toml介绍
UV 是由 Astral 团队(Ruff 工具开发者)用 Rust 编写的新一代 Python 包管理器,旨在替代传统工具链(如 pip、virtualenv、poetry 等),提供以下核心优势:
极速性能:依赖解析与安装速度比 pip 快 10-100 倍,尤其在大型项目中优势显著。
一体化功能:集成虚拟环境管理、依赖锁定、Python 版本控制、脚本执行等。
兼容性:支持 pyproject.toml 和 requirements.txt,无缝迁移现有项目。
跨平台:支持 Windows、macOS 和 Linux。
维度 | UV + | Conda | pip freeze |
---|---|---|---|
性能 | ⚡ 极快(Rust 并行处理) | ⏱️ 较慢 | ⏱️ 慢(依赖解析无优化) |
依赖管理 | ✅ 结构化分组 + 语义化版本 | ⚠️ 混合来源易冲突 | ❌ 扁平化、无分组 |
环境隔离 | ✅ 轻量( | ✅ 强隔离但体积大 | ✅ 需配合 |
适用场景 | Web 服务、微服务、CI/CD | 数据科学、AI(非 Python 依赖) | 旧项目维护 |
标准化 | ✅ PEP 621 官方标准 | ❌ 私有标准 | ❌ 非结构化文件 |
三、安装UV和配置环境路径
3.1 安装uv
按 Win + X
→ 选择 “Windows PowerShell(管理员)
# Windows (PowerShell)
irm https://astral.sh/uv/install.ps1 | iex# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
如果你安装的时候像我一样,输入 irm https://astral.sh/uv/install.ps1 | iex 命令后,窗口就自动关闭了。
可以试试
方法 1:临时修改执行策略(推荐)
在 当前 PowerShell 会话 中运行以下命令,允许运行本地脚本(关闭窗口后失效):
Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned
执行后重试安装命令:
irm https://astral.sh/uv/install.ps1 | iex
3.2 设置环境变量
-
打开环境变量设置
-
Win + R 输入
sysdm.cpl
→ 高级 → 环境变量
-
-
修改用户变量
-
在"用户变量"区域选择
Path
→ 编辑 → 新建 -
添加路径:
C:\Users\GDZD-BG-202115\.local\bin (根据自己的路径)
-
重启powershell就可以了验证是否安装成功了
uv --version
四、 使用UV管理Python项目
常用命令速查表
功能 | 命令 |
---|---|
创建虚拟环境 |
|
添加依赖 |
|
同步依赖 |
|
依赖树查看 |
|
运行脚本 |
|
更新所有依赖 |
|
导出依赖列表 |
|
注意:使用的IDE一定要全部关闭,重启一下VSCODE,这样才可以加载到你的全局环境变量。如果你开了多个VSCODE,只是关闭一个其中一个VSCODE,就一直加载不到设置好的全局变量。
而且VSCODE中需要设置默认终端是POWERSHELL
4.1 安装python版本
打印python支持的所有版本
uv python list
安装特定的支持的python版本比如(3.10)
uv python install cpython-3.10.18-windows-x86_64-none
使用 已经下载的python版本运行一个py文件
uv run -p 3.10 hello.py
uv run -p cpython-3.10.0b3 hello.py # 写全也可以
使用python交互界面
uv run -p cpython-3.10.0b3 python
4.2 进入项目初始化项目
在 VS Code 中新建项目目录,通过终端执行
uv init -p 3.10
-
生成文件:
-
pyproject.toml
:记录项目元数据(名称、Python 版本、依赖) -
.python-version
:指定项目默认 Python 版本 -
README.md
和.gitignore
(基础模板)
-
比如代码main.py
from fastapi import FastAPI
import uvicorn
app = FastAPI() # 创建 FastAPI 实例
# 定义根路由,返回 JSON 响应
@app.get("/")
async def hello_world():
return {"message": "Hello World"}
# 可选:添加带路径参数的端点
@app.get("/hello/{name}")
async def greet(name: str):
return {"message": f"Hello {name}"}
if __name__ == '__main__':
# http://localhost:8001/hello/Alice
uvicorn.run(app, host="127.0.0.1", port=8001)
直接添加这个包,然后uv会自动创建一个虚拟环境
uv add fastapi
会发现主依赖还有很多其他依赖。
在vscode右下角,选择虚拟环境。(如果找不到python版本号,就重启vscode就行)
4.3 导入和项目无关的包
加上 --dev参数,就会避免和主要成包混淆
uv add ruff --dev
移除依赖,比如移除ruff
uv remove ruff --dev
把ruff当做一个tool下载到系统中
uv tool install ruff
这样子ruff这个包不在到pyproject.toml中,是一个单独的进程自己运行
uv tool install 是系统的,每一个项目都可以用
4.4 打包成运行脚本,让别人可以直接使用
在pyproject.toml文件中加上
[project.scripts]
脚本名称 = "py文件:文件中的函数名"
[project.scripts]
hb_test = "main:func"
main.py是这样的
def func(query: str):
return {"query": query}
if __name__ == "__main__":
func()
使用下面命令打包成一个whl文件可以让别人下载,主要,项目架构只能有一个main.py不能有别的py文件并列
uv build
dist\helloworld-0.1.0-py3-none-any.whl
使用uv tool install 或uv add 方法来安装自己发布的包
uv tool install dist\helloworld-0.1.0-py3-none-any.whl
uv add dist\helloworld-0.1.0-py3-none-any.whl
查看已经安装的工具
uv tool list
使用自己的工具
# 使用刚刚写的,脚本工具名再给对应参数直接运行,
hb_test
# 或者这样运行
uv tool run helloworld
这个卡住了,不知道为什么。。。用不了工具
卸载工具
uv tool uninstall 工具名
uv tool uninstall helloword
查看包的依赖关系
uv pip tree
其他
虚拟环境和包
手动管理环境和包
创建虚拟环境(替换 venv 和 virtualenv):
uv venv
: 创建一个新的虚拟环境。
在环境中管理软件包(替换 pip 和 pipdeptree):
uv pip install
: 将包安装到当前环境。
uv pip show
: 显示已安装包的详细信息。
uv pip freeze
: 列出已安装的包及其版本。
uv pip check
: 检查当前环境中的包是否兼容。
uv pip list
: 列出已安装的包。
uv pip uninstall
: 卸载包。
uv pip tree
: 查看环境的依赖树。
在环境中锁定包(替换 pip-tools):
uv pip compile
: 将依赖项编译到锁文件中。
uv pip sync
: 使用锁文件同步环境。
对比维度 | | |
---|---|---|
主要用途 | 项目依赖管理(记录+锁定) | 临时安装包(不修改项目配置) |
依赖记录 | 写入 | ❌ 不修改任何配置文件 |
依赖锁定 | ✅ 更新 | ❌ 不生成/更新锁定文件 |
环境隔离 | 默认安装到项目虚拟环境 | 依赖当前激活环境(可能污染全局) |
项目一致性 | ✅ 确保团队/环境依赖一致 | ❌ 无法保证版本一致性 |
适用场景 | 正式项目开发、协作环境 | 临时工具安装、调试 |
五、 参考文章
uv的出现能淘汰多少python工具……