python 的三种虚拟环境
在 Python 开发中,使用虚拟环境可以帮助我们隔离不同项目的依赖,避免包版本冲突。常用的三种虚拟环境工具有 conda、venv 和 uv。下面介绍它们的创建方式。
1. conda 虚拟环境
conda 虚拟环境的介绍可查看此篇文章
2. venv 虚拟环境
venv 是 Python 标准库自带的虚拟环境工具,适用于大多数项目。由于它不需要安装额外的软件,是目前 Python 项目中最基础、最通用的选择。
2.1. 创建 venv 虚拟环境
打开终端或命令行,导航到你的项目目录,然后运行以下命令来创建一个新的虚拟环境:
# 通用语法:python -m venv <虚拟环境名称>
# 推荐做法(将环境命名为 .venv 或 venv)
python -m venv .venv.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 .venv在 Mac 或 Linux 中,不同版本的 Python 通常以 python3.x 的命令存在。
假设你想创建一个 Python 3.10 的环境:
# 直接调用该版本的命令
python3.10 -m venv .venv2.2. 激活 venv 虚拟环境
激活虚拟环境:
Windows(cmd)
# 如果你的虚拟环境目录是 .venv
.\.venv\Scripts\activateWindows (PowerShell)
.venv\Scripts\Activate.ps1注意:如果 PowerShell 提示“禁止运行脚本”,你需要先执行一次 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser 来允许脚本运行。
macOS 或 Linux
# 如果你的虚拟环境目录是 .venv
source .venv/bin/activate2.3. 在 venv 中安装依赖
导出依赖列表(便于分享给他人),生成 requirements.txt 文件。
pip freeze > requirements.txt2.4. 退出 venv 虚拟环境
deactivate2.5. 删除 venv 虚拟环境
venv 创建的虚拟环境本质上就是一个文件夹(例如 .venv)。如果不再需要这个环境,或者环境坏了想重来,直接删除这个文件夹即可。
# Linux / macOS
rm -rf .venv
# Windows
rmdir /s /q .venv千万不要把虚拟环境文件夹(
.venv)提交到 Git 仓库中你应该在项目根目录创建一个
.gitignore文件,并在其中添加一行:.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 | shWindows (PowerShell):
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"或者通过 pip :
pip install uv3.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.10这样 uv 会先检查系统是否有 python 3.10,如果没有,它会自动从官方源下载并安装该版本,并使用这个版本创建虚拟环境。
然后和普通的 venv 一样,你需要手动激活该环境:
# 在 Windows 上
venv\Scripts\activate
# 或者在 macOS / Linux 上
source venv/bin/activate2. 项目开发的最佳实践
在正式开发中,通常推荐使用 uv init 初始化项目,这样可以将 Python 版本锁定在配置文件中,方便团队协作。
初始化项目并指定版本:
# 创建新项目文件夹并初始化 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:
uv python pin 3.12这会更新
.python-version文件,并自动下载所需的 Python 版本。运行代码:
在项目目录下,不需要手动激活环境,直接运行:
# uv 会自动识别 .python-version 指定的版本来运行
uv run python app.py3.3. 项目管理模式
uv 目前主推的用法,类似于 Poetry 或 npm,全自动管理虚拟环境,不需要手动激活环境。
初始化项目
# 创建一个新文件夹并初始化
mkdir my-project
cd my-project
uv init生成一个 pyproject.toml 文件(现代 Python 项目标准配置文件)。
安装依赖
不需要手动激活环境,直接运行:
uv add requests pandasuv 会自动做以下几件事:
自动创建一个虚拟环境(默认在
.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__)"uv 会自动检测并在它管理的虚拟环境中运行该命令。
注意:uv run 默认用 .venv,而你的虚拟环境是 wx-vtuber
wx-vtuber\Scripts\python.exe test_api.py
# 或者
uv run --active test_api.py同步环境
如果你下载了别人的代码(含有 uv.lock),只需运行:
uv sync它会瞬间把环境还原成和作者一模一样的状态。
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. 核心特性对比表
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 足够轻量,开箱即用。