1. 虚拟环境概述
1.1 什么是虚拟环境
虚拟环境是一个独立的 python 运行环境,它允许你在同一台机器上为不同的项目安装不同的包和版本,而不会相互干扰。每个虚拟环境都拥有自己的 python 解释器副本、pip 包管理器以及独立的第三方库目录。
1.2 为什么需要虚拟环境
虚拟环境主要解决 python 开发中的三个关键问题:
- 依赖隔离:每个项目拥有独立的包安装空间,安装某包的特定版本不会影响系统 python 或其他项目。
- 版本管理:不同项目可以使用不同的 python 版本。一个机器学习项目可能需要 python 3.11 以获得更好性能,而遗留代码库可能需要 python 3.8 来兼容旧库。
- 可复现性:通过导出依赖列表,团队成员可以在不同机器上精确复现同一套开发环境,消除"在我机器上可以运行"的问题。
如果不使用虚拟环境,在全局安装不兼容的包可能导致系统工具不可用,严重时甚至需要重装操作系统。
2. venv 模块详解
2.1 简介
venv 是 python 标准库自带的虚拟环境管理模块,从 python 3.3 开始引入。它无需额外安装,是 python 官方推荐的默认虚拟环境管理方式。
2.2 创建虚拟环境
进入项目目录,执行以下命令创建虚拟环境:
python -m venv myenv
该命令会创建一个 myenv 目录,其中包含:python 解释器的副本、标准库、pip 包管理器以及用于激活环境的脚本。
指定 python 版本:当系统存在多个 python 安装时,可以通过指定 python 版本来创建环境:
# 使用 python 3.11 创建虚拟环境 python3.11 -m venv myenv
venv 会使用所调用 python 解释器的版本来创建环境,因此只需调用对应的 python3.x 命令即可切换版本。
重要说明:venv 创建的虚拟环境会固定到创建时所使用的 python 版本。如需使用不同版本的 python,可以加载对应的 python 模块后再创建,或转而使用 conda。
常用创建选项:
| 选项 | 说明 |
|---|---|
--system-site-packages | 允许虚拟环境访问系统全局安装的包 |
--clear | 如果环境目录已存在,先清空再创建 |
--upgrade | 使用最新的 python 可执行文件升级环境 |
2.3 激活虚拟环境
激活方式因操作系统而异:
linux / macos:
source myenv/bin/activate
windows command prompt:
myenv\scripts\activate.bat
windows powershell:
.\myenv\scripts\activate.ps1
激活成功后,终端提示符会显示环境名称,表明当前已进入虚拟环境:
(myenv) user@machine:~/project$
此后所有 pip install 命令安装的包都会指向该虚拟环境,而非系统 python。
验证激活是否成功:可以执行 pip list 查看依赖是全局还是当前环境,或查看命令行前面是否有 (myenv) 标识。
2.4 安装与管理包
在激活的虚拟环境中,像平常一样使用 pip:
pip install requests pandas numpy
这些包只会安装在当前虚拟环境中,可通过 pip list 验证:
pip list
2.5 导出与重建依赖
将当前环境中的所有包及版本导出到文件:
pip freeze > requirements.txt
在新环境中通过该文件重建完全相同的依赖:
pip install -r requirements.txt
2.6 退出虚拟环境
deactivate
提示符中的环境名会消失,后续操作将回到系统 python 环境。
3. virtualenv 工具详解
3.1 简介
virtualenv 是一个功能更强大的第三方虚拟环境管理工具,出现时间早于 venv。虽然需要单独安装,但它支持更旧的 python 版本(2.7+),并提供了更多的自定义选项和更快的环境创建速度。
3.2 安装 virtualenv
pip install virtualenv
安装完成后,可以通过以下命令验证:
virtualenv --version
3.3 创建虚拟环境
基本创建命令:
virtualenv myenv
这会创建一个与 virtualenv 自身相同 python 版本的虚拟环境。
指定 python 版本:
virtualenv -p python3.10 myenv
或使用完整路径指定解释器:
virtualenv -p /usr/bin/python3.8 myenv
其他有用选项:
| 选项 | 说明 |
|---|---|
--no-pip | 创建不包含 pip 的环境(之后可单独安装) |
--system-site-packages | 允许环境访问系统全局安装的包 |
--no-vcs-ignore | 不在环境目录中创建 vcs 忽略文件(如 .gitignore) |
3.4 激活与退出
激活方式与 venv 完全相同:
linux / macos:
source myenv/bin/activate
windows:
.\myenv\scripts\activate
退出:
deactivate
3.5 安装与管理包
与 venv 相同,激活环境后使用 pip 进行包管理:
pip install package_name pip freeze > requirements.txt
3.6 virtualenvwrapper 扩展
virtualenvwrapper 是一套基于 virtualenv 的扩展工具,提供了更方便的命令行接口来管理虚拟环境。
安装:
pip install virtualenvwrapper
配置(在 ~/.bashrc 或 ~/.zshrc 中添加):
export workon_home=$home/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh
常用命令:
| 命令 | 说明 |
|---|---|
mkvirtualenv myenv | 创建虚拟环境 |
workon myenv | 激活虚拟环境 |
deactivate | 退出虚拟环境 |
rmvirtualenv myenv | 删除虚拟环境 |
lsvirtualenv | 列出所有虚拟环境 |
4. conda 环境管理详解
4.1 简介
conda 是一个跨平台、跨语言的包管理和环境管理系统。与 venv 和 virtualenv 的显著不同在于,conda 不仅可以管理 python 包,还能管理 r 包、c/c++ 库等任何类型的软件包,并且会自动处理包之间的复杂依赖关系。它通过安装预编译的二进制包来工作,这使得它在数据科学、机器学习和科学计算领域尤为流行。
4.2 安装 conda
可以从以下两种发行版中选择安装:
- anaconda:包含 conda、python 以及超过 150 个常用科学计算包,体积较大。
- miniconda:仅包含 conda 和 python,体积小,用户可按需安装其他包。推荐有一定经验的用户使用。
安装后,建议初始化 shell 并关闭自动激活 base 环境:
conda init bash # linux/macos conda config --set auto_activate_base false
重启终端后生效。
4.3 创建虚拟环境
基本创建:
conda create --name myenv
这会创建一个名为 myenv 的空环境。
指定 python 版本(最常见用法):
conda create --name myenv python=3.10
还可以指定版本范围:
conda create --name myenv "python>=3.10"
创建时同时安装包:
conda create --name myenv python=3.10 numpy pandas matplotlib
指定包的精确版本:
conda create --name myenv python=3.10 numpy=1.24 pandas=2.0
克隆现有环境:
conda create --name newenv --clone oldenv
4.4 激活与退出
激活环境(适用于所有平台):
conda activate myenv
激活后终端提示符会显示环境名称。
退出环境:
conda deactivate
4.5 安装与管理包
激活环境后,可以使用 conda 或 pip 安装包:
# 使用 conda 安装 conda install numpy pandas # 从特定 channel 安装(如 conda-forge) conda install -c conda-forge scipy # 使用 pip 安装 conda 仓库中不存在的包 pip install some-package
4.6 环境列表与查看
# 列出所有环境 conda env list # 查看当前环境信息 conda info --envs # 搜索可用的包版本 conda search pandas
4.7 导出与重建环境
导出环境到 yaml 文件:
conda env export --from-history > environment.yml
这会生成一个包含环境所有信息的 yaml 文件。
示例 environment.yml 文件:
name: myproject
channels:
- conda-forge
- defaults
dependencies:
- python=3.11
- numpy=1.24
- pandas=2.0
- scikit-learn=1.3
- matplotlib=3.7
- jupyter
- pip
- pip:
- pygwalker从 yaml 文件重建环境:
conda env create -f environment.yml
4.8 删除环境
conda env remove --name myenv
或使用 --all 删除环境及所有关联包:
conda remove -n myenv --all
4.9 管理 channels
conda 通过 channels 来获取包,常用的 channel 是 conda-forge(社区维护的庞大软件仓库)。配置 channel 优先级可以获得更稳定可靠的依赖解析:
# 添加 conda-forge channel conda config --add channels conda-forge # 设置严格 channel 优先级 conda config --set channel_priority strict
5. 三者对比分析
5.1 核心特性对比表
| 维度 | venv | virtualenv | conda |
|---|---|---|---|
| 来源 | python 标准库(内置) | 第三方工具(需安装) | 第三方工具(需安装) |
| 适用语言 | 仅 python | 仅 python | python、r、c/c++ 等多语言 |
| 包管理器 | pip | pip | conda + pip |
| 包类型 | python 包(源码/whl) | python 包(源码/whl) | 预编译二进制包(任何语言) |
| python 版本支持 | python 3.3+ | python 2.7+ / 3.x | 不限制 |
| 依赖解析 | pip 解析(较弱) | pip 解析(较弱) | conda 解析(较强,自动处理复杂依赖) |
| 创建速度 | 标准 | 较快(优化过) | 较慢(需下载二进制包) |
| 跨平台 | 是 | 是 | 是 |
| 环境位置 | 项目目录内 | 项目目录内 | 用户目录或自定义位置 |
5.2 功能维度详细对比
包管理范围
- venv 和 virtualenv:主要关注 python 包的隔离,使用 pip 管理依赖,对于非 python 依赖(如系统级的 c 库)管理能力较弱。
- conda:可以管理任何类型的包,包括 python 包、r 包、c/c++ 库、系统级工具等,并会自动处理跨语言的包依赖关系。conda 还可以直接安装 python 和 pip 这些基础工具,减少了环境初始配置时间。
性能与环境创建
- virtualenv:通过符号链接和优化策略,创建速度比 venv 更快。
- venv:作为内置模块,无额外依赖,启动和使用最为轻量。
- conda:创建环境时需下载二进制包,速度相对较慢,但环境一旦建立后管理高效。
python 版本兼容性
- venv:仅支持 python 3.3 及以上版本,不支持 python 2。
- virtualenv:对 python 2 和 python 3 都有良好支持,适合需要维护遗留项目的场景。
- conda:不依赖系统 python 版本,可以在环境中安装任意版本 python,完全独立于系统安装。
5.3 适用场景分析
| 场景 | 推荐工具 |
|---|---|
| 简单的 python 3 项目 | venv(内置,零配置) |
| 同时涉及 python 2 和 python 3 | virtualenv |
| 数据科学与机器学习项目 | conda(科学计算包集成度高) |
| 需要管理非 python 二进制依赖 | conda |
| 追求最小化安装和轻量化 | venv |
| 多语言混合项目(python + r 等) | conda |
| 快速原型开发 | venv 或 virtualenv |
| 生产环境部署需精确复现 | conda(yaml 环境文件)或 venv(requirements.txt) |
6. 总结与建议
6.1 工具选择指南
- 入门或简单项目:优先使用 python 内置的 venv。它零依赖、无需额外安装,完全满足大多数 python 项目的需求。
- 需要兼容旧版本 python:选择 virtualenv。它是目前对 python 2.7 支持最好的虚拟环境工具,同时提供了更多的自定义选项和扩展工具(如 virtualenvwrapper)。
- 数据科学、机器学习或科学计算领域:选择 conda。conda 对 numpy、scipy、scikit-learn 等科学计算包的二进制管理极其高效,可以避免编译 c 扩展带来的各种麻烦。此外,conda 通过 yaml 环境文件提供了强大的环境复现能力,非常适合团队协作和生产部署。
- 需要管理非 python 依赖:无条件选择 conda。venv 和 virtualenv 的能力边界止于 python 生态,而 conda 可以管理任何类型的依赖。
6.2 最佳实践
- 始终使用虚拟环境:为每个项目创建独立的虚拟环境,避免依赖冲突。
- 使用 requirements.txt 或 environment.yml:将依赖列表纳入版本控制(git),确保团队环境一致。
- 忽略环境目录:将
venv/、.venv/或env/目录添加到.gitignore文件中,避免将虚拟环境提交到版本库。 - 合理选择环境位置:python 虚拟环境创建后不可移动,需提前规划好安装位置。
- 定期更新依赖:在虚拟环境中定期使用
pip或conda更新包,以获取安全修复和新功能。 - 在激活状态下操作:安装包或运行脚本前,务必确认虚拟环境已激活,避免将包意外安装到全局环境。
6.3 快速参考:三工具核心命令
| 操作 | venv | virtualenv | conda |
|---|---|---|---|
| 创建环境 | python -m venv myenv | virtualenv myenv | conda create -n myenv python=3.10 |
| 激活环境 | source myenv/bin/activate(linux) | 同 venv | conda activate myenv |
| 退出环境 | deactivate | deactivate | conda deactivate |
| 安装包 | pip install pkg | pip install pkg | conda install pkg |
| 导出依赖 | pip freeze > requirements.txt | 同 venv | conda env export > environment.yml |
| 删除环境 | 删除目录即可 | 删除目录即可 | conda env remove -n myenv |
| 列出环境 | 无内置命令 | lsvirtualenv(需 wrapper) | conda env list |
到此这篇关于python 虚拟环境完全指南:venv、virtualenv 与 conda详解的文章就介绍到这了,更多相关python venv、virtualenv 与 conda内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论