Skip to content

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

Updated on

Python 开发者经常会遇到一个共同难题:不同项目之间的依赖冲突。当多个应用需要同一个库的不同版本时,系统级安装会造成不兼容,从而导致代码崩溃。例如,一个数据科学项目可能需要 pandas 1.3.5,而某个 Web 应用却要求 pandas 2.0.0,这会让你几乎无法在同一个 Python 安装上同时运行两者。

在团队协作环境或将应用部署到生产服务器时,这个问题会更加严重。缺乏恰当隔离时,为某个项目安装的新依赖可能会破坏另一个项目,于是就出现经典的“在我机器上可以运行”场景,白白浪费数小时排查时间。

Python 虚拟环境通过创建相互隔离的空间来解决这一点:每个项目都能独立维护自己的依赖。本指南将覆盖从 venv 的基础用法到 conda 的高级环境管理,帮助你选择合适的工具,并在专业 Python 开发中落地最佳实践。

📚

为什么虚拟环境很重要

虚拟环境解决了 Python 开发中的三个关键问题:

依赖隔离:每个项目拥有独立的包安装,不会影响系统 Python 或其他项目。在一个环境中安装 Django 4.2,不会影响另一个环境里仍运行 Django 2.2 的遗留项目。

版本管理:不同项目可以使用不同的 Python 版本。一个机器学习项目可能使用 Python 3.11 以获得更好性能,而遗留代码库可能需要 Python 3.8 来兼容较旧的库。

可复现性:虚拟环境使得在不同机器上精确复现开发环境成为可能。通过导出依赖列表,团队成员可以复刻同一套环境,从而消除版本不一致导致的 bug。

如果不使用虚拟环境,开发者可能会破坏系统 Python 安装(操作系统常依赖它来提供核心功能)。在全局安装不兼容的包可能导致系统工具不可用;严重时需要复杂修复甚至重装操作系统。

Python venv 模块:内置解决方案

Python 3.3 引入了 venv 作为内置模块,用于创建轻量级虚拟环境。它无需额外安装,并为大多数项目提供了足够的功能。

使用 venv 创建虚拟环境

进入项目目录并创建虚拟环境:

python -m venv myenv

该命令会创建一个 myenv 目录,包含:

  • Python 解释器的副本
  • 标准库
  • pip 包管理器
  • 用于激活环境的脚本

当存在多个 Python 安装,需要指定特定版本时:

python3.11 -m venv myenv

激活虚拟环境

不同操作系统的激活方式不同:

Linux 和 macOS

source myenv/bin/activate

Windows Command Prompt

myenv\Scripts\activate.bat

Windows PowerShell

myenv\Scripts\Activate.ps1

激活后,终端提示符会在括号中显示环境名称:

(myenv) user@machine:~/project$

此后所有 pip 安装都会指向虚拟环境,而不是系统 Python。

在 venv 中安装包

在已激活环境的情况下,像平常一样安装包:

pip install pandas numpy matplotlib

这些包只会安装在虚拟环境中。可通过以下命令验证:

pip list

它会显示当前激活环境中的包,而不是系统级安装。

退出虚拟环境

回到系统 Python:

deactivate

提示符中的环境名会消失,pip 命令将再次作用于系统 Python。

virtualenv:增强版替代方案

virtualenv 早于 venv 出现,尽管需要单独安装,但提供了更多功能。它支持更旧的 Python 版本(2.7+),并通过优化实现更快的环境创建速度。

安装 virtualenv

pip install virtualenv

创建与使用 virtualenv 环境

virtualenv myenv

激活方式与 venv 完全相同。virtualenv 还提供了一些有用选项:

指定 Python 版本

virtualenv -p python3.10 myenv

创建时不包含 pip(之后再单独安装):

virtualenv --no-pip myenv

复制系统 site-packages(访问全局安装的包):

virtualenv --system-site-packages myenv

venv vs virtualenv

功能venvvirtualenv
安装方式内置(Python 3.3+)需要单独安装
Python 2 支持
创建速度标准通过缓存更快
高级选项有限丰富
维护者Python 核心团队社区项目
适用场景现代 Python 3 项目遗留系统、高级需求

对于新的 Python 3 项目,venv 通常足够。若你在使用 Python 2、需要更快的环境创建,或需要更高级的配置选项,则选择 virtualenv。

Conda 环境:科学计算领域的标准方案

Conda 同时管理包与环境,在数据科学领域尤为流行,擅长处理复杂依赖(例如包含 C/C++ 组件的数值计算库)。

安装 Conda

可下载以下之一:

  • Anaconda:完整发行版,预装 1500+ 包(3GB+)
  • Miniconda:最小化安装器,仅包含 conda、Python 与基础包(约 400MB)

对大多数开发者来说 Miniconda 更合适,因为它按需安装包。

创建 Conda 环境

conda create -n myenv python=3.11

创建时同时安装特定包:

conda create -n datascience python=3.11 pandas numpy scikit-learn jupyter

激活与退出 Conda 环境

conda activate myenv
conda deactivate

管理 Conda 包

从 conda 仓库安装:

conda install tensorflow

Conda 能自动处理复杂依赖,并且在很多情况下会用优化后的底层库进行编译,相比 pip 的等价包能获得更好性能。

列出已安装包:

conda list

导出与克隆 Conda 环境

导出环境规格:

conda env export > environment.yml

在另一台机器上重建环境:

conda env create -f environment.yml

克隆现有环境:

conda create --name newenv --clone myenv

Conda vs pip

Conda 环境中可以同时使用 conda 与 pip,但混用需要谨慎:

conda install pandas
pip install custom-package

建议先安装 conda 包,再安装 pip 包,以避免依赖解析冲突。

全面对比:现代 Python 环境工具

功能venvvirtualenvcondapipenvpoetry
安装方式内置pip install独立安装器pip installpip install
Python 版本系统版本任意已安装版本任意版本(可下载)系统版本系统版本
包来源PyPIPyPIConda 仓库 + PyPIPyPIPyPI
依赖解析基础(pip)基础(pip)高级高级高级
锁定文件environment.ymlPipfile.lockpoetry.lock
二进制包有限有限丰富有限有限
科学计算需手动配置需手动配置已优化需手动配置需手动配置
速度最快较慢中等中等
学习成本中等中等中等
最适合简单项目遗留 Python数据科学现代应用发布包

选择 venv:适用于需求直接、没有复杂依赖的 Python 3 项目。

选择 conda:适用于数据科学、机器学习,或依赖需要编译库的二进制依赖项目。

选择 poetry:适用于要发布到 PyPI,或需要严格依赖管理的项目。

选择 pipenv:适用于需要可复现环境、并希望自动管理虚拟环境的 Web 应用。

使用 requirements.txt 管理依赖

requirements.txt 用于指定精确的包版本,以便复现环境。

创建 requirements.txt

冻结当前环境的包:

pip freeze > requirements.txt

会生成类似:

pandas==2.1.4
numpy==1.26.2
matplotlib==3.8.2

从 requirements.txt 安装

创建一个新的环境:

python -m venv newenv
source newenv/bin/activate  # or appropriate activation for your OS
pip install -r requirements.txt

这会安装指定的精确版本,从而保证环境一致性。

requirements.txt 最佳实践

生产环境固定版本

Django==4.2.7
psycopg2-binary==2.9.9

开发环境用版本范围提高灵活性

Django>=4.2,<5.0
pytest>=7.0

区分开发依赖与生产依赖

requirements.txt(生产):

Django==4.2.7
gunicorn==21.2.0

requirements-dev.txt(开发):

-r requirements.txt
pytest==7.4.3
black==23.12.0

安装开发依赖:

pip install -r requirements-dev.txt

添加注释提升可读性

# Web framework
Django==4.2.7

# Database adapter
psycopg2-binary==2.9.9

# Development tools
pytest==7.4.3  # Testing framework

使用 pyproject.toml 的现代 Python 打包

PEP 518 引入了 pyproject.toml 作为标准化配置文件,用于替代 setup.py 与其他配置文件。

pyproject.toml 基本结构

[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
 
[project]
name = "myproject"
version = "1.0.0"
description = "A sample Python project"
readme = "README.md"
requires-python = ">=3.8"
dependencies = [
    "pandas>=2.0.0",
    "numpy>=1.24.0",
]
 
[project.optional-dependencies]
dev = [
    "pytest>=7.0",
    "black>=23.0",
]

使用 pip 配合 pyproject.toml

安装项目依赖:

pip install -e .

安装并包含开发依赖:

pip install -e ".[dev]"

Poetry 工作流

Poetry 使用 pyproject.toml 实现完整依赖管理:

poetry new myproject
cd myproject
poetry add pandas numpy
poetry add --group dev pytest black

Poetry 会自动创建并管理虚拟环境:

poetry install  # Creates venv and installs dependencies
poetry shell    # Activates environment

在 IDE 中使用虚拟环境

VS Code 配置

VS Code 会自动检测标准位置中的虚拟环境(.venv、venv、env)。

选择 Python 解释器

  1. Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS)
  2. 输入 “Python: Select Interpreter”
  3. 选择你的虚拟环境

自动激活:VS Code 在打开集成终端时会激活所选环境。

.vscode/settings.json 中配置:

{
    "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
    "python.terminal.activateEnvironment": true
}

PyCharm 配置

PyCharm 提供了全面的虚拟环境集成:

创建虚拟环境

  1. File → Settings → Project → Python Interpreter
  2. 点击齿轮图标 → Add
  3. 选择 “Virtualenv Environment”
  4. 选择新建或已有环境

自动激活:PyCharm 会为终端与运行配置自动激活项目解释器。

Jupyter Notebooks 与虚拟环境

在虚拟环境中安装 ipykernel:

source myenv/bin/activate
pip install ipykernel
python -m ipykernel install --user --name=myenv

这样该环境会作为一个 kernel 出现在 Jupyter 中:

jupyter notebook

在 kernel 菜单中选择 “myenv”。

对于大量使用 Jupyter 的数据科学家,RunCell (opens in a new tab) 提供了 AI 驱动的 Jupyter 环境,可自动管理虚拟环境与依赖,从而免去手动配置环境的工作,让你更专注于分析。

常见虚拟环境问题

Python 版本不正确

问题:虚拟环境使用了错误的 Python 版本。

解决方案:显式指定 Python 解释器:

python3.11 -m venv myenv

或使用 virtualenv:

virtualenv -p /usr/bin/python3.11 myenv

找不到激活脚本

问题:“activate: No such file or directory”

解决方案:确认环境创建是否成功完成,必要时重新创建:

rm -rf myenv
python -m venv myenv

PowerShell 执行策略错误

问题:Windows PowerShell 阻止激活脚本执行。

解决方案:允许当前用户执行脚本:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

PATH 中未识别环境

问题:激活后仍使用系统 Python。

解决方案:通过检查 Python 路径验证是否激活成功:

which python  # Linux/macOS
where python  # Windows

应指向虚拟环境目录。若不是,先退出再重新激活:

deactivate
source myenv/bin/activate

包安装失败

问题:在虚拟环境中 pip install 报错。

解决方案:升级 pip、setuptools 与 wheel:

pip install --upgrade pip setuptools wheel

Conda 环境冲突

问题:混用 conda 与 pip 导致依赖问题。

解决方案:先装 conda 包,再装 pip 包:

conda install numpy pandas
pip install custom-library

或尽可能只使用 conda:

conda install -c conda-forge package-name

虚拟环境最佳实践

命名约定

使用描述性且一致的命名:

  • .venv - 项目专用环境的常见隐藏目录名
  • venv - 常见替代方案
  • myproject-env - 多项目并行时更具描述性

避免使用像 “env” 或 “python” 这种过于泛化的名称,以免混淆。

.gitignore 配置

务必将虚拟环境排除在版本控制之外:

# Virtual environments
venv/
.venv/
env/
ENV/
myenv/

# Conda environments
conda-env/

# Virtual environment markers
pyvenv.cfg

项目结构

用清晰的结构组织项目,明确区分环境:

myproject/
├── .venv/                 # Virtual environment (not in git)
├── src/
│   └── myproject/
│       └── __init__.py
├── tests/
│   └── test_main.py
├── requirements.txt       # Production dependencies
├── requirements-dev.txt   # Development dependencies
├── pyproject.toml         # Project configuration
├── README.md
└── .gitignore

每个项目一个环境

为每个项目创建专用虚拟环境,而不是共享同一个环境。这能避免依赖冲突,并简化调试。

记录环境搭建方式

在 README.md 中写明安装步骤:

## Setup
 
1. Create virtual environment:

python -m venv .venv


2. Activate environment:
- Linux/macOS: `source .venv/bin/activate`
- Windows: `.venv\Scripts\activate`

3. Install dependencies:

pip install -r requirements.txt

定期更新依赖

定期更新包并测试兼容性:

pip list --outdated
pip install --upgrade package-name
pip freeze > requirements.txt

可使用 pip-review 批量更新:

pip install pip-review
pip-review --local --interactive

Docker vs 虚拟环境

Docker 容器与虚拟环境解决的是不同层级的隔离问题:

虚拟环境在同一操作系统内隔离 Python 包。它提供:

  • 轻量的资源占用
  • 快速创建与激活
  • 对大多数开发场景已足够的隔离
  • 与本地工具良好集成

Docker 容器隔离的是完整应用栈,包括 OS、系统库与服务。它提供:

  • 完整的环境可复现性
  • 开发与生产一致的行为
  • 系统级依赖隔离
  • 对多服务应用的支持

何时使用哪一个

使用虚拟环境

  • 本地开发与测试
  • 仅 Python 的项目、无系统依赖
  • 快速原型与实验
  • 个人开发工作流

使用 Docker

  • 生产部署
  • 含系统级依赖的应用
  • 多服务架构(Web 应用 + 数据库 + 缓存)
  • 团队统一标准环境
  • CI/CD 流水线

结合使用

很多项目会在开发时用虚拟环境,在部署时用 Docker:

Dockerfile:

FROM python:3.11-slim
 
WORKDIR /app
 
COPY requirements.txt .
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
 
RUN pip install -r requirements.txt
 
COPY . .
 
CMD ["python", "app.py"]

这种方式即使在容器内部也使用虚拟环境,以获得更清晰的依赖管理。

使用 pyenv 管理多个 Python 版本

pyenv 可简化 Python 版本的安装与切换,并与虚拟环境工具形成互补。

安装 pyenv

Linux/macOS:

curl https://pyenv.run | bash

Windows:使用 pyenv-win:

Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"

安装 Python 版本

列出可用版本:

pyenv install --list

安装指定版本:

pyenv install 3.11.7
pyenv install 3.10.13

设置 Python 版本

全局(系统级):

pyenv global 3.11.7

本地(项目目录):

cd myproject
pyenv local 3.10.13

这会创建 .python-version 文件,用于指定该目录的 Python 版本。

将 pyenv 与虚拟环境结合

pyenv local 3.11.7
python -m venv .venv
source .venv/bin/activate

或使用 pyenv-virtualenv 插件:

pyenv virtualenv 3.11.7 myproject-env
pyenv activate myproject-env

这将 Python 版本管理与虚拟环境创建整合为统一工作流。

高级虚拟环境技巧

在虚拟环境中使用环境变量

将配置存放在环境专用文件中:

.env:

DATABASE_URL=postgresql://localhost/mydb
SECRET_KEY=development-secret-key
DEBUG=True

使用 python-dotenv 加载:

pip install python-dotenv
from dotenv import load_dotenv
import os
 
load_load_dotenv()
database_url = os.getenv('DATABASE_URL')

激活前/后脚本

通过修改激活脚本,自定义环境激活时的行为。

Linux/macOS - 编辑 myenv/bin/activate

在最后一行之前添加:

export DATABASE_URL="postgresql://localhost/mydb"
export FLASK_ENV="development"

Windows - 创建 myenv/Scripts/activate.bat

添加:

set DATABASE_URL=postgresql://localhost/mydb
set FLASK_ENV=development

在多个项目间共享虚拟环境

通常不推荐,但对于依赖完全一致的相关项目,共享环境也可行:

python -m venv ~/shared-envs/data-science
source ~/shared-envs/data-science/bin/activate

你可以在多个项目目录中激活同一个环境。但这种做法一旦出现依赖冲突,可能会同时破坏所有项目。

常见问题(FAQ)

结论

Python 虚拟环境是专业 Python 开发的基础:它能防止依赖冲突,并让项目环境可复现。内置的 venv 模块能够高效覆盖大多数使用场景,而 conda 则在涉及复杂二进制依赖的数据科学项目中表现更佳。poetry 与 pipenv 等现代工具则为需要严格版本控制的项目提供了更高级的依赖解析能力。

成功的虚拟环境管理遵循清晰模式:每个项目一个环境、完善的 .gitignore 规则、以及文档化的环境搭建流程。再结合 pyenv 进行 Python 版本管理,以及 IDE 集成带来的流畅体验,虚拟环境能将混乱的依赖管理转变为系统化、可预测的流程。

对于在 Jupyter notebooks 中工作的数据科学家,RunCell (opens in a new tab) 提供了 AI 驱动的环境,可自动处理虚拟环境的复杂性,让你把精力放在分析而非配置上。无论你使用 venv 来做简单项目,还是使用 conda 来进行科学计算,虚拟环境仍然是每位 Python 开发者必须掌握的核心工具。

在你的下一个项目中,从一个干净的虚拟环境开始,并记录好搭建步骤。未来的你和团队成员都会感谢这种可复现性与隔离性,它能避免你在神秘的依赖问题上浪费数小时调试时间。

📚