13 KiB
补充:Conda、pip、uv 与 Python 虚拟环境的区别
一、先给出结论
这些名称不完全属于同一类工具:
venv、virtualenv:主要负责创建相互隔离的 Python 环境;pip:主要负责向某个 Python 环境安装和卸载 Python 软件包,本身不负责创建虚拟环境;- Conda:同时管理环境、Python 版本、Python 包和部分非 Python 软件;
uv:同时覆盖 Python 版本、虚拟环境、依赖安装、项目依赖和锁文件等工作。
因此,“Conda、pip、uv 哪个虚拟环境更好”这个问题并不完全准确。更合适的问题是:
当前项目应该使用哪一种环境管理与依赖管理组合?
二、几个概念不要混在一起
2.1 Python 解释器
Python 解释器是实际运行 .py 文件的程序,例如当前机器检测到的:
C:\ProgramData\miniconda3\python.exe
不同环境可能有自己的解释器入口,也可能使用不同的 Python 版本。
2.2 虚拟环境
虚拟环境负责隔离项目使用的 Python 和已安装软件包。例如项目 A 与项目 B 可以分别拥有自己的 .venv,互不影响。
2.3 包管理器
包管理器负责查找、安装、更新和卸载软件包:
pip主要管理 Python 软件包;- Conda 可以管理 Conda 软件包,其中可以包含 Python、Python 包以及其他软件;
uv可以通过项目工作流或兼容 pip 的命令管理 Python 依赖。
2.4 依赖解析与锁定
依赖解析负责计算“安装哪些版本才能彼此兼容”。锁文件用于记录解析后的精确结果,使其他机器尽量复现相同环境。
常见文件包括:
- pip 工作流:
requirements.txt; - Conda 工作流:
environment.yml,也可配合相应锁文件; - uv 项目工作流:
pyproject.toml和uv.lock。
三、venv:Python 自带的基础选择
venv 是 Python 标准库中的虚拟环境工具,不需要单独安装。
创建环境:
python -m venv .venv
激活:
.\.venv\Scripts\Activate.ps1
在环境中安装包:
python -m pip install 软件包名称
特点:
- Python 自带,概念简单;
- 通常基于创建它的现有 Python;
- 只负责创建环境,不负责完整项目锁定;
- 通常与
pip、requirements.txt一起使用; - 适合普通 Python 脚本、Web 后端和入门学习。
典型组合:
venv 创建环境
+ pip 安装依赖
+ requirements.txt 记录依赖
四、virtualenv:功能更丰富的环境创建工具
virtualenv 是需要额外安装的第三方工具。Python 官方打包指南说明,venv 是 Python 自带方案,而 virtualenv 提供更广的兼容性和额外能力。
基本命令:
virtualenv .venv
特点:
- 主要职责与
venv相同,都是创建隔离环境; - 需要先安装;
- 提供更丰富的解释器选择、配置和兼容能力;
- 在只需要基础环境隔离的新项目中,通常先用
venv就够了。
对当前零基础课程,不必同时学习 venv 和 virtualenv。先理解 venv,以后遇到明确需求再使用 virtualenv。
五、pip:软件包安装器,不是虚拟环境
pip 的职责是把 Python 软件包安装到某个环境。
推荐命令:
python -m pip install 软件包名称
这里的关键是“当前这个 Python”:
- 如果当前 Python 来自
.venv,依赖会装入.venv; - 如果当前 Python 来自 Conda 环境,依赖会装入该 Conda 环境;
- 如果当前 Python 是全局环境,依赖可能被装入全局环境。
所以 pip 自己不提供隔离,隔离由 venv、virtualenv 或 Conda 环境等机制提供。
pip 常见能力:
python -m pip install 软件包名称
python -m pip uninstall 软件包名称
python -m pip list
python -m pip show 软件包名称
python -m pip check
python -m pip install -r requirements.txt
优点:
- Python 生态中最通用;
- PyPI 上的软件包覆盖广;
- 与
venv配合简单; - 教程、部署平台和持续集成环境普遍支持。
需要注意:
- 安装前必须确认当前解释器;
requirements.txt与环境本身是两回事;pip freeze会导出当前环境全部软件包,环境不干净时可能带入无关依赖。
六、Conda:环境管理器加跨语言包管理器
Conda 同时负责环境和包管理。它可以在创建环境时指定 Python 版本:
conda create -n python-course python=3.13
conda activate python-course
安装 Conda 软件包:
conda install 软件包名称
查看环境:
conda env list
Conda 环境与普通 venv 的重要区别:
- Conda 可以直接管理环境中的 Python 版本;
- Conda 包不局限于纯 Python 包,也能包含本地库、命令行程序等内容;
- 软件包来自 Conda channel,例如
defaults或conda-forge; - 环境通常集中保存在 Conda 安装目录的
envs下,也可以使用指定路径; - 环境描述常使用
environment.yml。
Conda 更适合:
- 数据科学、机器学习和科学计算;
- 依赖 NumPy、PyTorch、CUDA 或本地二进制库的项目;
- 需要同时管理 Python 与非 Python 软件的环境;
- 已经以 Anaconda、Miniconda 或 Miniforge 作为主要 Python 发行方式的团队。
代价和注意事项:
- 工具体系比
venv + pip更大; - channel 和包来源会影响解析结果;
- Conda 包版本可能与 PyPI 发布节奏不同;
- 同一环境混用 Conda 与 pip 时需要保持清晰边界。
七、Conda 环境中能不能使用 pip
可以,但建议遵守以下顺序:
- 创建并激活独立 Conda 环境;
- 优先一次性安装需要的 Conda 包;
- 确认使用的是当前环境中的 pip;
- 只有 Conda channel 没有需要的软件包时,再使用 pip;
- pip 安装后如果还要大规模调整 Conda 依赖,优先考虑重建环境,而不是反复混装。
示例:
conda create -n python-course python=3.13 pip
conda activate python-course
python -c "import sys; print(sys.executable)"
python -m pip --version
然后才能确认 pip 指向当前 Conda 环境。
不建议在一个环境中无计划地交替执行大量 conda install 和 pip install。两套工具使用不同的软件包格式与依赖信息,复杂项目可能出现一方不知道另一方具体修改了什么的问题。
八、uv:速度较快的一体化 Python 工具
uv 是独立工具,不依赖当前 Python 才能启动。它覆盖多项工作:
- 安装和选择 Python;
- 创建虚拟环境;
- 安装与卸载 Python 软件包;
- 管理
pyproject.toml项目; - 生成并使用
uv.lock; - 同步项目环境;
- 在项目环境中运行命令。
仅创建虚拟环境:
uv venv
使用类似 pip 的接口:
uv pip install 软件包名称
uv pip list
uv pip check
完整项目工作流:
uv init
uv add 软件包名称
uv sync
uv run python main.py
在项目工作流中:
pyproject.toml声明项目及直接依赖;uv.lock记录解析后的精确依赖;- 默认项目环境通常是
.venv; uv run会在运行前确认锁文件和项目环境保持同步。
官方文档建议:使用 uv 项目工作流时,通过 uv add 管理项目依赖,不要把 uv pip install 当作项目依赖声明方式。uv pip 更适合兼容传统 pip 工作流或手动管理环境。
九、uv 与 pip 的关系
uv pip 提供与 pip 类似的命令体验,但 uv 并不是 pip 的插件,也不是简单调用 pip。
可以这样理解:
传统方式:venv + pip + requirements.txt
uv 兼容方式:uv venv + uv pip + requirements.txt
uv 项目方式:uv + pyproject.toml + uv.lock + .venv
如果使用完整 uv 项目工作流,常用命令通常是:
uv add
uv remove
uv sync
uv run
而不是手动激活环境后不断执行 uv pip install。
十、uv 与 Conda 的区别
两者都能管理 Python 和环境,但侧重点不同。
Conda:
- 以 Conda 包、channel 和 Conda 环境为核心;
- 能管理更广泛的非 Python 依赖;
- 在科学计算、数据分析和机器学习生态中常见;
- 可以管理 Python、R、系统库和二进制程序等内容。
uv:
- 以现代 Python 项目、PyPI、
pyproject.toml和锁文件为核心; - 默认使用项目内
.venv; - 适合普通 Python 应用、库、工具和 Web 后端;
- 依赖操作和环境同步速度通常是其主要优势之一。
如果项目强依赖 CUDA、本地科学计算库或 Conda channel,Conda 通常更自然。如果项目主要是 PyPI 中的 Python 依赖,uv 项目工作流通常更轻量。
十一、核心对比表
| 工具 | 创建隔离环境 | 安装 Python 包 | 管理 Python 版本 | 管理非 Python 软件 | 典型依赖文件 | 适合场景 |
|---|---|---|---|---|---|---|
venv |
是 | 否,通常配合 pip | 否,使用已有 Python | 否 | 无,常配合 requirements.txt |
入门、普通脚本、Web 项目 |
virtualenv |
是 | 否,通常配合 pip | 选择已有解释器 | 否 | 无,常配合 requirements.txt |
需要更强环境创建能力 |
pip |
否 | 是 | 否 | 通常不负责 | requirements.txt |
向现有 Python 环境安装包 |
| Conda | 是 | 是 | 是 | 是 | environment.yml 等 |
数据科学、机器学习、二进制依赖 |
uv |
是 | 是 | 是 | 主要面向 Python 生态 | pyproject.toml、uv.lock |
现代 Python 项目和 Web 后端 |
十二、应该如何选择
12.1 零基础学习和理解原理
优先学习:
venv + pip
原因是它们能清楚展示“环境隔离”和“包安装”是两个不同职责,也是 Python 官方文档中的基础工作流。
12.2 普通 Python、FastAPI 或 Django 项目
可以选择:
venv + pip
或者:
uv 项目工作流
前者通用、容易理解;后者在依赖解析、锁定和同步方面更加一体化。
12.3 数据科学和机器学习
如果涉及复杂科学计算、CUDA 或系统二进制依赖,可以优先考虑:
Conda
必要时在独立 Conda 环境中谨慎补充 pip 包。
12.4 当前教学项目
当前机器的 python 来自 Miniconda,但这不等于每个项目都必须使用 Conda 环境。
为了理解基础概念,本课程讲义使用 venv + pip。以后进入 FastAPI 和 Django 阶段,可以根据学习目标二选一:
- 继续使用
venv + pip,保持通用和透明; - 切换到 uv 项目工作流,学习现代依赖锁定与同步。
不建议在同一个项目中同时维护 requirements.txt、environment.yml 和 uv.lock 三套互不一致的依赖事实来源。应该选定一种主要工作流。
十三、常见误区
13.1 “pip 创建了虚拟环境”
不正确。通常是 venv 创建环境,pip 向环境安装软件包。
13.2 “激活环境后就安装了依赖”
不正确。激活只切换当前终端优先使用的解释器和工具,依赖仍需单独安装或同步。
13.3 “Conda 环境就是 Python venv”
两者都能实现隔离,但内部结构、包格式、依赖来源和管理范围不同,不能简单视为同一个实现。
13.4 “uv pip 就是速度更快的 pip 命令别名”
不准确。它提供兼容 pip 的操作方式,但 uv 是独立实现,并且还有完整的项目、Python、环境和锁文件管理能力。
13.5 “有锁文件就不需要虚拟环境”
不正确。锁文件描述应该安装什么,虚拟环境保存实际安装结果,两者职责不同。
13.6 “把 .venv 复制到另一台机器就能复用”
不推荐。虚拟环境可能包含绝对路径和平台相关文件。应在新机器重新创建环境,并根据依赖文件安装或同步。
十四、推荐记忆方式
venv / virtualenv:创建隔离房间
pip:向房间里安装 Python 包
Conda:创建房间,并管理 Python 与更广的软件
uv:创建房间,并管理现代 Python 项目、依赖和锁文件