在 Python 开发中,使用虚拟环境可以帮助我们隔离不同项目的依赖,避免包版本冲突。常用的三种虚拟环境工具有 conda、venv 和 uv。下面介绍它们的创建方式。
1. conda 虚拟环境#
conda 虚拟环境的介绍可查看此篇文章 ↗
2. venv 虚拟环境#
venv 是 Python 标准库自带的虚拟环境工具,适用于大多数项目。由于它不需要安装额外的软件,是目前 Python 项目中最基础、最通用的选择。
2.1. 创建 venv 虚拟环境#
打开终端或命令行,导航到你的项目目录,然后运行以下命令来创建一个新的虚拟环境:
# 通用语法:python -m venv <虚拟环境名称>
# 推荐做法(将环境命名为 .venv 或 venv)
python -m venv .venvbash.venv:这是虚拟环境文件夹的名字。
- 习惯 1:命名为
.venv(前面有个点),这样它默认是隐藏的,且通常会被编辑器自动识别。 - 习惯 2:命名为
venv,也是非常常见的做法。
注意:
与 conda 不同, venv 不支持使用类似 python -m venv --python=3.8 来指定 Python 版本。
如果你想创建一个 Python 3.8 的虚拟环境,你必须先在你的电脑上找到并运行 Python 3.8 的解释器。
在 Windows 上安装 Python 时,通常会默认安装一个叫 Python Launcher (py.exe) 的工具。它可以帮你轻松指定版本。
创建一个 Python 3.9 的环境:
# 语法:py -[版本号] -m venv [环境名]
py -3.9 -m venv .venvcmd在 Mac 或 Linux 中,不同版本的 Python 通常以 python3.x 的命令存在。
假设你想创建一个 Python 3.10 的环境:
# 直接调用该版本的命令
python3.10 -m venv .venvbash2.2. 激活 venv 虚拟环境#
激活虚拟环境:
Windows(cmd)#
# 如果你的虚拟环境目录是 .venv
.\.venv\Scripts\activatebashWindows (PowerShell)#
.venv\Scripts\Activate.ps1powershellWindows 推荐使用指令:
venv\Scripts\activate,这样不需要注意使用的是 cmd 还是 powershell。
注意:如果 PowerShell 提示“禁止运行脚本”,你需要先执行一次 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 来允许脚本运行。
macOS 或 Linux#
# 如果你的虚拟环境目录是 .venv
source .venv/bin/activatebash2.3. 在 venv 中安装依赖#
导出依赖列表(便于分享给他人),生成 requirements.txt 文件。
pip freeze > requirements.txtbash2.4. 退出 venv 虚拟环境#
deactivatebash2.5. 删除 venv 虚拟环境#
venv 创建的虚拟环境本质上就是一个文件夹(例如 .venv)。如果不再需要这个环境,或者环境坏了想重来,直接删除这个文件夹即可。
# Linux / macOS
rm -rf .venv
# Windows
rmdir /s /q .venvbash千万不要把虚拟环境文件夹(
.venv)提交到 Git 仓库中你应该在项目根目录创建一个
.gitignore文件,并在其中添加一行:text.venv/
3. uv 虚拟环境#
uv 是一个轻量级的虚拟环境管理工具,适合快速创建和切换虚拟环境。可在此篇文章获得 uv 的详细介绍和使用方法:uv 虚拟环境介绍 ↗
uv 是目前 Python 社区最炙手可热的工具,由 Rust 编写。它的核心特点只有一个字:快。
它不仅比 pip 快 10-100 倍,而且是一个大一统工具:它可以替代 pip、pip-tools(锁定依赖)、virtualenv(创建环境)、甚至 pyenv(管理 Python 版本)。
uv 的使用方式主要分为两种模式:现代项目模式和 Pip 兼容模式。
3.1. 安装 uv#
macOS / Linux:
curl -LsSf https://astral.sh/uv/install.sh | shbashWindows (PowerShell):
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"powershell或者通过 pip :
pip install uvbash3.2. 创建 uv 虚拟环境#
如果你不希望在全局安装 uv,那么需要先使用 python 自带的 venv 创建一个虚拟环境,然后在该环境中安装 uv。
但这样会导致无法使用 uv 指定特定的 Python 版本来创建虚拟环境。
1. 使用 uv 创建一个类似 venv 的虚拟环境:
# 创建一个基于 Python 3.10 的虚拟环境(默认目录名为 .venv)
uv venv --python 3.10
# 或者指定环境名称
uv venv my_env --python 3.10bash这样 uv 会先检查系统是否有 python 3.10,如果没有,它会自动从官方源下载并安装该版本,并使用这个版本创建虚拟环境。
然后和普通的 venv 一样,你需要手动激活该环境:
# 在 Windows 上
venv\Scripts\activate
# 或者在 macOS / Linux 上
source venv/bin/activatebash2. 项目开发的最佳实践
在正式开发中,通常推荐使用 uv init 初始化项目,这样可以将 Python 版本锁定在配置文件中,方便团队协作。
-
初始化项目并指定版本:
bash# 创建新项目文件夹并初始化 uv init my_project --python 3.10 # 或者在已有文件夹中初始化 cd my_existing_project uv init --python 3.10这会生成一个
.python-version文件(内容只有版本号,如3.9.18)和一个pyproject.toml文件。 -
修改现有项目的 Python 版本
把一个现有项目的 Python 版本从 3.11 切换到 3.12:
bashuv python pin 3.12这会更新
.python-version文件,并自动下载所需的 Python 版本。 -
运行代码:
在项目目录下,不需要手动激活环境,直接运行:
# uv 会自动识别 .python-version 指定的版本来运行
uv run python app.pybash3.3. 项目管理模式#
uv 目前主推的用法,类似于 Poetry 或 npm,全自动管理虚拟环境,不需要手动激活环境。
初始化项目#
# 创建一个新文件夹并初始化
mkdir my-project
cd my-project
uv initbash生成一个 pyproject.toml 文件(现代 Python 项目标准配置文件)。
安装依赖#
不需要手动激活环境,直接运行:
uv add requests pandasbashuv 会自动做以下几件事:
- 自动创建一个虚拟环境(默认在
.venv) - 下载并安装
requests和pandas - 将依赖写入
pyproject.toml - 生成一个
uv.lock文件(锁定版本,确保安全)
运行代码#
这是 uv 最爽的功能。你不需要 source .venv/bin/activate,直接用 uv run:
# 运行脚本
uv run main.py
# 或者临时运行一个命令
uv run python -c "import requests; print(requests.__version__)"bashuv 会自动检测并在它管理的虚拟环境中运行该命令。
注意:uv run 默认用 .venv,而你的虚拟环境是 wx-vtuber
wx-vtuber\Scripts\python.exe test_api.py
# 或者
uv run --active test_api.pybash同步环境#
如果你下载了别人的代码(含有 uv.lock),只需运行:
uv syncbash它会瞬间把环境还原成和作者一模一样的状态。
3.4. uv 下载的 py 在哪#
使用 uv python install 3.12 或 uv init --python 3.12 时,uv 会将 py 安装在一个全局目录中。
具体路径(默认情况):
- macOS:~/Library/Application Support/uv/python/ 或者 ~/.local/share/uv/python/
- Linux:~/.local/share/uv/python/
- Windows:%LOCALAPPDATA%\uv\python
(通常是 C:\Users\用户名\AppData\Local\uv\python`
三者优劣#
了解了 conda、venv 和 uv 的基本用法后,我们从创建机制、依赖管理、性能等维度对它们进行深度比对。
4.1. 核心特性对比表#
| 维度 | venv (标准库) | conda (Anaconda) | uv (新一代) |
|---|---|---|---|
| 安装成本 | Python 内置 | 安装 Miniconda/Anaconda | 单文件/pip 安装 |
| Python 版本管理 | ❌ 弱 (仅限当前系统安装的版本) | ✅ 强 (可任意指定并下载版本) | ✅ 极强 (自动下载 Managed Python) |
| 非 Python 库支持 | ❌ 不支持 (需系统预装 C 库) | ✅ 强 (支持 CUDA, GCC, FFmpeg) | ❌ 不支持 (仅限 PyPI) |
| 依赖锁定机制 | 弱 (仅靠 requirements.txt) | 中 (environment.yml) | ✅ 强 (uv.lock 全局锁定) |
| 运行速度 | 普通 | 较慢 (尤其是依赖解析) | 🚀 极快 (Rust 编写) |
| 磁盘占用 | 高 (每个环境复制一套包) | 较高 (但有硬链接优化) | ✅ 极低 (全局缓存 + 硬链接) |
4.2. 深度解析#
1. 创建与版本管理的灵活性#
- venv:最大的痛点在于它看天吃饭。如果你的系统里只装了 Python 3.8,你就造不出 Python 3.10 的环境。想切版本,你得先去官网下载安装包,配置环境变量,比较繁琐。
- conda:自带版本库。一句
conda create -n myenv python=3.9就能解决问题,非常适合需要频繁在不同 Python 版本间横跳的用户。 - uv:它不仅能像 Conda 一样自动下载安装 Python 版本,而且下载速度和环境构建速度是毫秒级的。
2. 依赖管理的侧重点#
- conda:数据科学的神。很多科学计算包(如 NumPy, PyTorch)依赖底层的 C/C++ 库。在 Windows 上用 pip 编译这些源码往往会报错,而 Conda 提供的是预编译好的二进制包,省去了编译痛苦,且能管理 CUDA 等非 Python 依赖。
- venv:适合大多数纯 Python 项目,但在处理复杂依赖树时,容易出现“依赖地狱”。
- uv:引入了类似
npm或Poetry的uv.lock文件机制,确保“在我机器上能跑,在你机器上也能跑”。同时,它利用硬链接技术,多个项目共用同一个包缓存,极大地节省了磁盘空间。
3. 速度与体验#
- uv 是绝对的王者。在安装大型依赖(如 PyTorch)或解析复杂的版本冲突时,uv 比 pip 快 10 到 100 倍。
- conda 的依赖解析器在包很多时会变得非常慢(虽然 libmamba 改善了这一点,但仍不及 uv)。
4.3. 最终选取建议#
根据你的开发场景,对号入座:
-
如果你是数据科学家、AI 研究员,或者是 Windows 初学者:
👉 首选 Conda (Miniconda)。
理由:你不想折腾 C++ 编译器错误,你需要一行命令装好 PyTorch 和 CUDA 环境。
-
如果你是 Web 后端开发者、开源库维护者,追求工程规范:
👉 首选 uv。理由:你需要极速的 CI/CD 构建速度,严格的
uv.lock依赖锁定,以及便捷的项目管理体验。它是 Poetry 的完美极速替代品。 -
如果你只是写个小脚本,或者在 Docker 容器里部署应用:
👉 首选 venv。
理由:Docker 容器本身已经是隔离环境,再装 uv 或 conda 略显臃肿。系统自带的 venv 足够轻量,开箱即用。