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

相关推荐
老白干2 小时前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j
笨鸟先飞,勤能补拙9 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能9 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂10 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study10 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境11 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境11 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd12311 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy123931021612 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb0012 小时前
一个项目带你入门AI应用开发01
python