跳到主要内容Python 虚拟环境完全指南:venv、virtualenv、conda、pipenv 深度对比与实战选择 | 极客日志PythonAI算法
Python 虚拟环境完全指南:venv、virtualenv、conda、pipenv 深度对比与实战选择
综述由AI生成深入对比了 Python 四种主流虚拟环境工具 venv、virtualenv、conda 和 pipenv。针对依赖冲突、多版本管理及科学计算需求,分析了各工具的适用场景与优缺点。venv 适合通用开发,conda 擅长数据科学与底层库管理,pipenv 虽设计优良但维护停滞。文章提供了选型决策树及生产环境最佳实践,包括 Docker 集成与 pyenv 配合,帮助开发者构建隔离、可复现的项目环境。
无尘17K 浏览 Python 虚拟环境完全指南:venv、virtualenv、conda、pipenv 深度对比与实战选择
引言:你的 Python 环境,乱了吗?
'它在我电脑上跑得好好的……'
这句话,几乎是每个 Python 开发者的噩梦起点。你兴冲冲地把项目发给同事,对方却报错一片。原因往往很简单:你们用的 requests 版本不一样,或者你装了某个全局包,而对方没有。
更糟糕的情况:你同时维护三个项目,A 需要 Django 3.2,B 需要 Django 4.2,C 需要 Flask——全装在全局环境里,依赖之间打架,pip install 一个包,另一个项目就崩了。
这不是段子,这是我亲身经历过的"依赖地狱"。而虚拟环境,就是那把解开这个死结的钥匙。
Python 生态里有四个主流的虚拟环境工具:venv、virtualenv、conda、pipenv。它们各有来头,各有所长,也各有短板。今天这篇文章,我们就从原理到实战,把这四个工具彻底讲清楚,帮你在不同场景下做出最明智的选择。
第一章:为什么需要虚拟环境?先把概念搞清楚
1.1 全局环境的问题
当你直接运行 pip install numpy,包被安装在哪里?
python -m site --user-site
pip show numpy | grep Location
所有包都堆在同一个目录下,项目之间共享,版本冲突是迟早的事:
全局 Python 环境(危险区)
├── requests 2.28.0 ← 项目 A 需要
├── requests 2.31.0 ← 项目 B 需要(pip 会强制覆盖)
├── Django 3.2 ← 项目 A 需要
└── Django 4.2 ← 项目 B 需要(同上,覆盖)
pip 无法同时安装同一个包的两个版本。全局环境,注定是冲突的温床。
1.2 虚拟环境的本质
虚拟环境本质上非常简单:一个独立的目录,包含特定版本的 Python 解释器和独立的包安装路径。
项目结构(正确姿势)
├── project_a/
│ ├── .venv/ ← 项目 A 的专属环境
│ │ └── lib/python3.11/site-packages/
│ │ ├── requests-2.28.0/
│ │ └── django-3.2/
│ └── src/
└── project_b/
├── .venv/ ← 项目 B 的专属环境
│ └── lib/python3.11/site-packages/
│ ├── requests-2.31.0/
│ └── django-4.2/
└── src/
激活虚拟环境后,python 和 pip 命令都指向这个独立目录,安装和运行完全隔离。
第二章:venv——内置工具,够用就好
2.1 基本介绍
venv 自 Python 3.3 起内置于标准库,无需安装任何额外工具。它是最轻量的选择,也是官方推荐的基础方案。
2.2 核心操作
python -m venv .venv
source .venv/bin/activate
.venv\Scripts\Activate.ps1
.venv\Scripts\activate.bat
(.venv) $ which python
(.venv) $ pip install requests flask
(.venv) $ pip freeze > requirements.txt
(.venv) $ deactivate
2.3 指定 Python 版本
python3.11 -m venv .venv
python3.10 -m venv .venv-310
(.venv) $ python --version
Python 3.11.4
2.4 requirements.txt 的最佳实践
很多人不知道,requirements.txt 有两种写法:
# requirements.txt(精确版本锁定,用于部署)
requests==2.31.0
Flask==3.0.0
Werkzeug==3.0.1
# requirements.in(宽松版本,用于开发声明)
requests>=2.28.0
flask
pip install pip-tools
pip-compile requirements.in -o requirements.txt
pip-sync requirements.txt
2.5 优缺点总结
venv 适合你,如果你:
✓ 不想安装额外工具
✓ 项目只需要纯 Python 包
✓ 系统上已有你需要的 Python 版本
✓ 部署到服务器,追求环境一致性
venv 不够用,如果你:
✗ 需要管理多个 Python 版本
✗ 需要安装科学计算包(numpy、scipy 等带 C 扩展的)
✗ 团队协作,需要更强的依赖锁定能力
第三章:virtualenv——venv 的前辈与增强版
3.1 历史背景
virtualenv 出现在 venv 之前,是 Python 社区虚拟环境的开山鼻祖。虽然 Python 内置了 venv,但 virtualenv 依然活跃,因为它在某些场景下提供了 venv 没有的能力。
pip install virtualenv
virtualenv .venv
virtualenv -p /usr/bin/python3.10 .venv
virtualenv --no-site-packages .venv
virtualenv --system-site-packages .venv
3.2 virtualenv 比 venv 多了什么?
virtualenv -p python2.7 .venv
pip install virtualenvwrapper
配置 virtualenvwrapper(在 ~/.bashrc 或 ~/.zshrc 中):
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
mkvirtualenv myproject
workon myproject
workon another_project
lsvirtualenv
rmvirtualenv myproject
3.3 与 venv 的选择建议
在现代 Python 开发(3.6+)中,venv 和 virtualenv 的功能差异已经很小。选择原则很简单:
- 需要兼容 Python 2 或 Python 3.3 以下 →
virtualenv
- 需要
virtualenvwrapper 这样的管理工具 → virtualenv
- 其他情况 →
venv(内置,无需安装,够用)
第四章:conda——科学计算者的瑞士军刀
4.1 conda 的不同之处
conda 和前两个工具有本质区别:它不只是虚拟环境工具,更是一个完整的包管理器,能管理非 Python 的依赖(如 CUDA、MKL、HDF5 等底层库)。
conda 管理的不只是 Python 包:
├── Python 解释器本身(任意版本)
├── Python 包(requests、numpy 等)
├── C/C++ 库(libssl、libblas 等)
├── CUDA 工具包
└── R、Julia 等其他语言包
这对数据科学家和 AI 研究者至关重要——安装 tensorflow-gpu 时,conda 能自动处理 CUDA 依赖,而 pip 经常让你陷入版本匹配的泥潭。
4.2 安装选择
Anaconda ≈ 3GB(包含数百个预装科学计算包,适合新手)
Miniconda ≈ 50MB(只含 conda 核心,按需安装,推荐)
Mamba ≈ Miniconda + C++ 重写的极速依赖解析器(专业用户首选)
4.3 核心操作
conda create -n myproject python=3.10
conda activate myproject
conda install -c conda-forge numpy pandas scikit-learn
pip install some-pure-python-package
conda env list
conda env export > environment.yml
conda env create -f environment.yml
conda env remove -n myproject
name: dl-project
channels:
- conda-forge
- defaults
dependencies:
- python=3.10
- numpy=1.24.0
- pandas=2.0.0
- scikit-learn=1.3.0
- cudatoolkit=11.8
- pip:
- transformers==4.35.0
- wandb
4.4 conda 的管理 Python 版本能力
这是 conda 最被低估的功能——在同一台机器上轻松切换任意 Python 版本:
conda create -n py38-test python=3.8
conda activate py38-test
python --version
conda create -n py312-cutting-edge python=3.12
conda activate py312-cutting-edge
python --version
不需要 pyenv,不需要修改系统 Python,conda 一个工具全搞定。
4.5 实战案例:深度学习项目环境搭建
conda create -n dl-gpu python=3.10
conda activate dl-gpu
conda install -c conda-forge cudatoolkit=11.8.0
conda install -c conda-forge cudnn=8.6.0
conda install -c pytorch pytorch torchvision
python -c "import torch; print(torch.cuda.is_available())"
conda install -c conda-forge pandas scikit-learn matplotlib seaborn jupyter
pip install wandb mlflow
4.6 优缺点
conda 适合:
✓ 数据科学 / 机器学习 / 深度学习项目
✓ 需要管理 CUDA、MKL 等底层依赖
✓ 需要在同一台机器快速切换 Python 版本
✓ 团队中有非程序员背景的研究者(Anaconda 更友好)
conda 不适合:
✗ 纯 Web 开发(太重)
✗ 生产环境部署(conda 环境难以容器化,推荐 pip + Docker)
✗ 追求启动速度(conda activate 比 source .venv/activate 慢)
第五章:pipenv——理想丰满,现实骨感
5.1 pipenv 的设计初衷
pipenv 曾经是 Python 官方推荐的打包工具(后来撤销了推荐),它的目标很美好:把 pip + venv + 依赖锁定融合成一个工具,借鉴 npm 和 bundler 的设计理念。
pip install pipenv
cd myproject
pipenv install
pipenv install requests flask
pipenv install --dev pytest black
pipenv shell
pipenv run python main.py
pipenv run pytest
Pipfile 的格式比 requirements.txt 更直观:
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
requests = ">=2.28.0"
flask = "*"
[dev-packages]
pytest = ">=7.0"
black = "*"
[requires]
python_version = "3.11"
锁定文件 Pipfile.lock 精确记录所有依赖及其哈希值,安全性很高:
{"default":{"requests":{"version":"==2.31.0","hashes":["sha256:58cd2187423839b89cdf..."]}}}
5.2 pipenv 的问题
说实话,pipenv 的设计思路是好的,但工程实现让它口碑两极分化:
常见抱怨:
✗ 依赖解析速度极慢(大型项目 lock 一次要几分钟)
✗ 锁定文件经常出现冲突,团队协作时头疼
✗ 虚拟环境创建在 ~/.local/share/virtualenvs/ 而非项目目录
✗ 与 pyproject.toml 生态集成不佳
✗ 维护曾经长期停滞(2018-2022 年),社区信心受损
我的建议:如果你的项目已经在用 pipenv,且运行稳定,没有必要迁移。但新项目,我更推荐 Poetry(参考系列上一篇文章)或 venv + pip-tools 的组合。
第六章:横向对比与选型指南
6.1 四大工具对比速查
维度 venv virtualenv conda pipenv
─────────────────────────────────────────────────────────────────
内置标准库 ✓ ✗ ✗ ✗
安装难度 无需安装 pip install 独立安装 pip install
管理 Python 版本 ✗ ✗ ✓ ✗(需 pyenv)
非 Python 依赖 ✗ ✗ ✓ ✗
依赖锁定 需配合工具 需配合工具 environment.yml Pipfile.lock
lock 文件质量 ★★★★☆ ★★★★☆ ★★★☆☆ ★★★☆☆
环境创建速度 快 快(有缓存) 慢 中
适合场景 通用 通用/Python2 科学计算 Web(逐渐式微)
社区活跃度 ★★★★★ ★★★★☆ ★★★★★ ★★★☆☆
6.2 场景化选型决策树
你的项目是什么类型?
│
├── 数据科学 / 机器学习 / AI 研究
│ └── 需要 CUDA / 底层科学库?
│ ├── 是 → conda(首选) 或 conda + pip 混合
│ └── 否 → conda 或 venv + pip
│
├── Web 开发 / 后端服务
│ └── 需要依赖管理 + 打包发布一体化?
│ ├── 是 → Poetry(强烈推荐)
│ └── 否 → venv + pip-tools
│
├── 需要在同一机器管理多个 Python 版本?
│ ├── conda(一站式)
│ └── pyenv + venv(更轻量)
│
├── 遗留项目,Python 2 支持?
│ └── virtualenv
│
└── 简单脚本 / 学习用途
└── venv(够了)
6.3 我的日常工作流
Web / API 项目 → Poetry(依赖管理 + 打包一体化)
数据分析 / AI 项目 → conda(管理 CUDA 和科学包)
快速脚本 / 工具 → venv(内置,零成本)
CI/CD 环境 → venv + pip(Docker 里最简洁)
第七章:实战进阶——生产环境最佳实践
7.1 项目结构规范
my-python-project/
├── .venv/ ← 虚拟环境(加入 .gitignore)
├── src/
│ └── myapp/
│ ├── __init__.py
│ └── main.py
├── tests/
├── .gitignore ← 包含 .venv/ 和 __pycache__
├── pyproject.toml ← 现代项目配置
├── requirements.txt ← 精确锁定版本(用于部署)
└── requirements-dev.txt ← 开发工具依赖
# 虚拟环境
.venv/
venv/
ENV/
env/
# Python 缓存
__pycache__/
*.py[cod]
*.pyo
# conda
.conda/
7.2 团队协作最佳实践
# README.md 中的环境搭建说明(示范)
## 环境搭建
### 方式一:venv(推荐)
python -m venv .venv
source .venv/bin/activate
# Windows: .venv\Scripts\activate
pip install -r requirements.txt
### 方式二:conda
conda env create -f environment.yml
conda activate myproject
7.3 Docker 中的虚拟环境
在 Docker 中,容器本身提供了隔离,但虚拟环境仍有价值——防止系统 Python 被污染:
FROM python:3.11-slim
WORKDIR /app
# 在容器内也使用虚拟环境(最佳实践)
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY src/ .
CMD ["python", "main.py"]
7.4 配合 pyenv 管理 Python 版本
如果你不用 conda,又需要管理多个 Python 版本,pyenv 是最优解:
curl https://pyenv.run | bash
pyenv install 3.10.12
pyenv install 3.11.4
pyenv install 3.12.0
pyenv global 3.11.4
cd myproject
pyenv local 3.10.12
python -m venv .venv
python --version
第八章:前沿展望
8.1 uv——速度革命
前面打包篇提到的 uv,也在虚拟环境管理领域掀起波澜:
uv venv
uv pip install requests numpy pandas
uv python install 3.12
uv python pin 3.11
8.2 生态整合趋势
一是以 pyproject.toml 为中心的标准化——所有工具都支持这个统一配置文件。二是以 Rust 重写的性能革命——uv、ruff 等工具把 Python 工具链的速度提升了一个数量级。
未来两三年,我们可能看到 uv 成为新的默认选择,就像 black 统一了代码格式化一样。
总结
venv 是每个 Python 项目的基础保障,简单够用;virtualenv 是它的前辈,在特殊场景仍不可替代;conda 是数据科学家的工程基础设施,管理 Python 生态以外的复杂依赖;pipenv 设计理念超前,但执行层面留下了历史包袱。
记住一个核心原则:每个项目,必须有自己的独立环境。这不是建议,是 Python 工程实践的底线。
工具可以换,习惯必须养成。从今天起,把全局安装包的坏习惯丢掉,给每个项目一个干净的虚拟环境,你会发现开发体验有质的提升。
参考资料
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online