Python 项目的依赖管理有一个天生的麻烦:A 项目需要 requests==2.25.0,B 项目需要 requests>=2.28.0;如果两个项目都往操作系统全局的 Python 环境里装包,迟早会冲突得一塌糊涂。虚拟环境就是用来解决这个问题的——给每个项目一个隔离的 Python 运行环境,互不干扰。
为什么必须用虚拟环境
- 依赖隔离:每个项目可以有自己的包版本,即使它们需要的同一库版本矛盾,也不会相互影响。
- 环境干净:项目只包含它真正需要的依赖,不会意外引入全局装过的包,部署和迁移更可靠。
- 版本锁定:可以准确记录当前项目用到哪些包、什么版本,方便团队成员和服务器复现一模一样的环境。
- 无权限问题:有些系统环境(尤其是 Linux 服务器)不允许普通用户全局
pip install,虚拟环境在自己的用户目录下操作,完全可控。
venv:Python 自带的虚拟环境
venv 是 Python 3.3 起内置的模块,不需要额外安装任何东西,是轻量级项目的首选。
原理简述venv 在你指定的目录下创建一个精简的 Python 环境副本,包括:
- 一个指向系统 Python 解释器的链接(或拷贝),以及独立的
site-packages文件夹。 - 独立的
pip和python可执行文件,激活后运行的是这个虚拟环境里的版本。 - 环境变量(主要是
PATH)会被临时修改,让终端优先找到虚拟环境里的 Python 和 pip。
基本操作
# 创建虚拟环境(会在当前目录下生成 myenv 文件夹)
python -m venv myenv
# 激活环境 (Linux/macOS)
source myenv/bin/activate
# 激活环境 (Windows cmd)
myenv\Scripts\activate.bat
# 激活环境 (Windows PowerShell)
myenv\Scripts\Activate.ps1
# 现在 pip install 的包都会装进 myenv 里
pip install pandas
# 退出虚拟环境
deactivate
实用技巧
- 环境文件夹命名:很多项目习惯把虚拟环境目录命名为
.venv或venv,并添加到.gitignore,避免上传到版本库。 - 结合 requirements.txt:激活环境后,用
pip freeze > requirements.txt导出所有依赖及精确版本;别人拿到项目,用pip install -r requirements.txt就能一模一样复现环境。
conda 环境:跨语言、管理更强的选择
conda 来自 Anaconda 发行版,但也可以单独安装 Miniconda 获得。它和 venv 的核心区别在于:conda 不仅管理 Python 包,还能管理 Python 版本本身以及各种非 Python 的二进制依赖(比如 C 库、R 语言、cuda-toolkit 等)。
原理简述
- conda 维护一套独立的包仓库(channel),从里面下载预先编译好的软件包。
- 每个 conda 环境都是一个完整的隔离目录,包含独立的 Python 解释器、C 标准库、依赖包等,与系统 Python 完全解耦。
- 通过环境变量和硬链接/复制机制实现隔离,激活后只找到当前环境的可执行程序。
基本操作
# 创建一个指定 Python 版本的环境
conda create -n myenv python=3.10
# 激活环境
conda activate myenv
# 安装包(conda 优先从 conda-forge 等渠道找)
conda install numpy pandas
# 也可以用 pip 在 conda 环境里装包(注意顺序:先用 conda 再用 pip,减少冲突)
pip install requests
# 导出环境配置(跨平台可复现)
conda env export > environment.yml
# 从配置文件复现环境
conda env create -f environment.yml
# 退出环境
conda deactivate
conda vs venv 怎么选
| 场景 | 推荐工具 |
|------|----------|
| 纯 Python 项目,依赖简单 | venv(轻量、无额外安装) |
| 需要用特定 Python 版本,但系统不方便升级 | conda(环境自带 Python) |
| 数据科学、AI 项目,依赖 numpy/pandas 等带 C 扩展的包 | conda(省去编译苦,装包更快更稳) |
| 需要混合语言(如 Python + R + 命令行工具) | conda |
| 注重环境最小化和部署体积 | venv |
最佳实践
- 每个项目都有自己的虚拟环境,不要在全局 Python 上直接安装项目依赖。
- 激活环境后再干活,养成习惯——打开项目目录第一件事就是
source venv/bin/activate或conda activate xxx。 - 锁定依赖版本:
- 用
venv的项目,提交requirements.txt。 - 用
conda的项目,提交environment.yml。 - 更严谨的可以用
pip-tools或poetry区分直接依赖和间接依赖,但初期freeze足够用。
- 环境目录不要进版本管理:把
venv/、.venv/或 conda 环境名写入.gitignore。 - 别混着装包:在 conda 环境里,优先用
conda install,装不到的再用pip install;反对在同一个环境里同时大量使用conda和pip安装一个库的不同版本,容易起冲突。 - 定期重建环境:拿到新的
requirements.txt或environment.yml时,删掉旧环境重新创建,检验依赖清单是否完整且可复现。
把虚拟环境用顺了,你就告别了“这台机器能跑,那台不行”的痛苦,也为后续的部署、协作奠定了一个扎实的基础。