Python 虚拟环境完全指南:venv、virtualenv 与 Conda

Python 虚拟环境完全指南:venv、virtualenv 与 Conda

目录

  1. 虚拟环境概述
  2. [venv 模块详解](#venv 模块详解)
  3. [virtualenv 工具详解](#virtualenv 工具详解)
  4. [Conda 环境管理详解](#Conda 环境管理详解)
  5. 三者对比分析
  6. 总结与建议

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 创建虚拟环境

进入项目目录,执行以下命令创建虚拟环境:

bash 复制代码
python -m venv myenv

该命令会创建一个 myenv 目录,其中包含:Python 解释器的副本、标准库、pip 包管理器以及用于激活环境的脚本。

指定 Python 版本:当系统存在多个 Python 安装时,可以通过指定 Python 版本来创建环境:

bash 复制代码
# 使用 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

bash 复制代码
source myenv/bin/activate

Windows Command Prompt

bash 复制代码
myenv\Scripts\activate.bat

Windows PowerShell

bash 复制代码
.\myenv\Scripts\Activate.ps1

激活成功后,终端提示符会显示环境名称,表明当前已进入虚拟环境:

复制代码
(myenv) user@machine:~/project$

此后所有 pip install 命令安装的包都会指向该虚拟环境,而非系统 Python。

验证激活是否成功:可以执行 pip list 查看依赖是全局还是当前环境,或查看命令行前面是否有 (myenv) 标识。

2.4 安装与管理包

在激活的虚拟环境中,像平常一样使用 pip:

bash 复制代码
pip install requests pandas numpy

这些包只会安装在当前虚拟环境中,可通过 pip list 验证:

bash 复制代码
pip list

2.5 导出与重建依赖

将当前环境中的所有包及版本导出到文件:

bash 复制代码
pip freeze > requirements.txt

在新环境中通过该文件重建完全相同的依赖:

bash 复制代码
pip install -r requirements.txt

2.6 退出虚拟环境

bash 复制代码
deactivate

提示符中的环境名会消失,后续操作将回到系统 Python 环境。


3. virtualenv 工具详解

3.1 简介

virtualenv 是一个功能更强大的第三方虚拟环境管理工具,出现时间早于 venv。虽然需要单独安装,但它支持更旧的 Python 版本(2.7+),并提供了更多的自定义选项和更快的环境创建速度。

3.2 安装 virtualenv

bash 复制代码
pip install virtualenv

安装完成后,可以通过以下命令验证:

bash 复制代码
virtualenv --version

3.3 创建虚拟环境

基本创建命令:

bash 复制代码
virtualenv myenv

这会创建一个与 virtualenv 自身相同 Python 版本的虚拟环境。

指定 Python 版本

bash 复制代码
virtualenv -p python3.10 myenv

或使用完整路径指定解释器:

bash 复制代码
virtualenv -p /usr/bin/python3.8 myenv

其他有用选项

选项 说明
--no-pip 创建不包含 pip 的环境(之后可单独安装)
--system-site-packages 允许环境访问系统全局安装的包
--no-vcs-ignore 不在环境目录中创建 VCS 忽略文件(如 .gitignore)

3.4 激活与退出

激活方式与 venv 完全相同:

Linux / macOS

bash 复制代码
source myenv/bin/activate

Windows

bash 复制代码
.\myenv\Scripts\activate

退出:

bash 复制代码
deactivate

3.5 安装与管理包

与 venv 相同,激活环境后使用 pip 进行包管理:

bash 复制代码
pip install package_name
pip freeze > requirements.txt

3.6 virtualenvwrapper 扩展

virtualenvwrapper 是一套基于 virtualenv 的扩展工具,提供了更方便的命令行接口来管理虚拟环境。

安装

bash 复制代码
pip install virtualenvwrapper

配置 (在 ~/.bashrc~/.zshrc 中添加):

bash 复制代码
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 环境:

bash 复制代码
conda init bash          # Linux/macOS
conda config --set auto_activate_base false

重启终端后生效。

4.3 创建虚拟环境

基本创建

bash 复制代码
conda create --name myenv

这会创建一个名为 myenv 的空环境。

指定 Python 版本(最常见用法):

bash 复制代码
conda create --name myenv python=3.10

还可以指定版本范围:

bash 复制代码
conda create --name myenv "python>=3.10"

创建时同时安装包

bash 复制代码
conda create --name myenv python=3.10 numpy pandas matplotlib

指定包的精确版本

bash 复制代码
conda create --name myenv python=3.10 numpy=1.24 pandas=2.0

克隆现有环境

bash 复制代码
conda create --name newenv --clone oldenv

4.4 激活与退出

激活环境(适用于所有平台):

bash 复制代码
conda activate myenv

激活后终端提示符会显示环境名称。

退出环境

bash 复制代码
conda deactivate

4.5 安装与管理包

激活环境后,可以使用 conda 或 pip 安装包:

bash 复制代码
# 使用 conda 安装
conda install numpy pandas

# 从特定 channel 安装(如 conda-forge)
conda install -c conda-forge scipy

# 使用 pip 安装 conda 仓库中不存在的包
pip install some-package

4.6 环境列表与查看

bash 复制代码
# 列出所有环境
conda env list

# 查看当前环境信息
conda info --envs

# 搜索可用的包版本
conda search pandas

4.7 导出与重建环境

导出环境到 YAML 文件

bash 复制代码
conda env export --from-history > environment.yml

这会生成一个包含环境所有信息的 YAML 文件。

示例 environment.yml 文件

yaml 复制代码
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 文件重建环境

bash 复制代码
conda env create -f environment.yml

4.8 删除环境

bash 复制代码
conda env remove --name myenv

或使用 --all 删除环境及所有关联包:

bash 复制代码
conda remove -n myenv --all

4.9 管理 Channels

Conda 通过 channels 来获取包,常用的 channel 是 conda-forge(社区维护的庞大软件仓库)。配置 channel 优先级可以获得更稳定可靠的依赖解析:

bash 复制代码
# 添加 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
快速原型开发 venvvirtualenv
生产环境部署需精确复现 Conda (YAML 环境文件)或 venv(requirements.txt)

6. 总结与建议

6.1 工具选择指南

  1. 入门或简单项目 :优先使用 Python 内置的 venv。它零依赖、无需额外安装,完全满足大多数 Python 项目的需求。

  2. 需要兼容旧版本 Python :选择 virtualenv。它是目前对 Python 2.7 支持最好的虚拟环境工具,同时提供了更多的自定义选项和扩展工具(如 virtualenvwrapper)。

  3. 数据科学、机器学习或科学计算领域 :选择 Conda。Conda 对 NumPy、SciPy、scikit-learn 等科学计算包的二进制管理极其高效,可以避免编译 C 扩展带来的各种麻烦。此外,Conda 通过 YAML 环境文件提供了强大的环境复现能力,非常适合团队协作和生产部署。

  4. 需要管理非 Python 依赖 :无条件选择 Conda。venv 和 virtualenv 的能力边界止于 Python 生态,而 Conda 可以管理任何类型的依赖。

6.2 最佳实践

  • 始终使用虚拟环境:为每个项目创建独立的虚拟环境,避免依赖冲突。
  • 使用 requirements.txt 或 environment.yml:将依赖列表纳入版本控制(Git),确保团队环境一致。
  • 忽略环境目录 :将 venv/.venv/env/ 目录添加到 .gitignore 文件中,避免将虚拟环境提交到版本库。
  • 合理选择环境位置:Python 虚拟环境创建后不可移动,需提前规划好安装位置。
  • 定期更新依赖 :在虚拟环境中定期使用 pipconda 更新包,以获取安全修复和新功能。
  • 在激活状态下操作:安装包或运行脚本前,务必确认虚拟环境已激活,避免将包意外安装到全局环境。

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

相关推荐
独隅1 小时前
Conda 与 Miniconda 全面对比:核心差异、适用场景与选型指南
conda
MATLAB代码顾问1 小时前
【智能优化】杜鹃搜索算法(CSA)原理与Python实现
开发语言·python
子豪-中国机器人1 小时前
词云支持的 所有核心效果
python
AC赳赳老秦2 小时前
数据安全合规:OpenClaw 敏感信息脱敏、操作日志审计、权限精细化管控方案,符合等保要求
网络·数据库·python·安全·web安全·oracle·openclaw
AIFQuant2 小时前
贵金属 API 避坑:黄金/白银行情接口常见陷阱(数据漂移、断点、延迟)
开发语言·python·websocket·金融·restful·贵金属
财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年5月9日
人工智能·python·信息可视化·自然语言处理·ai编程
shehuiyuelaiyuehao2 小时前
算法21,搜索插入位置
python·算法·leetcode
Volunteer Technology2 小时前
携程智能体项目
人工智能·python·numpy
平安的平安2 小时前
Python实现RAG检索增强生成:让大模型拥有你的私有知识库
开发语言·python