虚拟环境详解
2026-02-14
运维
00
请注意,本文编写于 49 天前,最后修改于 5 天前,其中某些信息可能已经过时。

目录

一、为什么需要虚拟环境?
1.1 Python 的"依赖地狱"
1.2 虚拟环境的核心价值
二、Python 虚拟环境技术全景
2.1 技术演进时间线
2.2 工具对比矩阵
三、venv:标准库方案(轻量首选)
3.1 基础用法
3.2 进阶配置
3.3 完整工作流
3.4 venv 的局限
四、virtualenv:venv 的增强版
4.1 与 venv 的区别
4.2 何时还用 virtualenv?
五、Poetry:现代 Python 项目管理
5.1 核心优势
5.2 工作流对比
5.3 Poetry 的局限
六、Miniconda/Conda:数据科学与生产首选
6.1 为什么数据科学必选 Conda?
6.2 Miniconda 完整安装
6.3 Conda 环境 vs Python venv 对比
6.4 Conda 环境实战
6.5 Conda 与 Pip 混合最佳实践
七、工具选型决策树
八、生产环境最佳实践
8.1 Docker 中的虚拟环境
8.2 CI/CD 中的环境管理
九、完整命令速查表

一、为什么需要虚拟环境?

1.1 Python 的"依赖地狱"

展开代码
# 场景 1:系统 Python 被污染 sudo pip install requests # 破坏系统包,yum/apt 可能崩溃 pip install numpy==1.19 # 项目 A 需要 1.19 pip install numpy==1.24 # 项目 B 需要 1.24,A 崩溃 # 场景 2:Python 版本冲突 python3 --version # 系统 Python 3.6 # 新项目需要 Python 3.10 特性 # 升级系统 Python = 系统工具崩溃 # 场景 3:开发 vs 生产不一致 开发机:Mac + Python 3.9 + 手动编译的库 生产机:Linux + Python 3.8 + 缺失系统依赖 # "在我电脑上能跑"

1.2 虚拟环境的核心价值

问题虚拟环境解决方案
依赖版本冲突每个项目独立隔离,互不影响
Python 版本差异多版本 Python 并存,自由切换
开发与生产不一致导出锁定文件,精确复现环境
权限问题无需 sudo,用户级安装
部署复杂打包环境,一键迁移

二、Python 虚拟环境技术全景

2.1 技术演进时间线

展开代码
2007 virtualenv 诞生 # 第一个第三方虚拟环境工具 2012 venv 加入标准库 (Python 3.3) # 官方内置,无需安装 2016 Pipenv 发布 # Pipfile + Lock,但速度慢 2018 Poetry 发布 # 现代依赖管理,pyproject.toml 2019 Conda 生态成熟 # 跨语言、二进制包、数据科学首选 2020 Python 3.9 venv 支持 --upgrade-deps 2023 uv 发布 (Rust 编写) # 极速替代,兼容 pip

2.2 工具对比矩阵

工具类型Python 版本管理非 Python 包速度适用场景
venv标准库❌ 需配合 pyenv⭐⭐⭐标准库够用,简单项目
virtualenv第三方❌ 需配合 pyenv⭐⭐⭐兼容旧 Python,功能更多
Pipenv第三方⭐⭐不推荐,Lock 慢,争议大
Poetry第三方❌ 需插件⭐⭐⭐⭐现代 Python 项目,依赖解析强
Conda/Miniconda独立发行版✅ 原生支持✅ C/C++/R/Node⭐⭐⭐⭐⭐数据科学、ML、生产部署
uv第三方 (Rust)✅ 原生支持⭐⭐⭐⭐⭐⭐极速替代 pip,新兴工具
PDM第三方✅ PEP 582⭐⭐⭐⭐⭐现代替代,PEP 标准支持

三、venv:标准库方案(轻量首选)

3.1 基础用法

展开代码
# 创建虚拟环境(当前目录下创建 venv/ 文件夹) python3 -m venv myenv # 指定 Python 版本(需系统已安装) python3.10 -m venv myenv-py310 # 激活(Linux/macOS) source myenv/bin/activate # 激活(Windows) myenv\Scripts\activate.bat # 停用 deactivate # 删除环境(直接删文件夹) rm -rf myenv

3.2 进阶配置

展开代码
# 创建时升级 pip(Python 3.9+) python3 -m venv myenv --upgrade-deps # 不带 pip(极简,需手动安装) python3 -m venv myenv --without-pip # 使用系统 site-packages(不推荐) python3 -m venv myenv --system-site-packages # 查看环境配置 cat myenv/pyvenv.cfg # home = /usr/bin # version = 3.10.12 # executable = /usr/bin/python3.10

3.3 完整工作流

展开代码
# 项目初始化 mkdir myproject && cd myproject python3 -m venv venv source venv/bin/activate # 安装依赖 pip install --upgrade pip pip install flask sqlalchemy # 锁定依赖(生产必备) pip freeze > requirements.txt # 或更精确的 pip-tools pip install pip-tools pip-compile requirements.in # 生成 requirements.txt # 生产部署 python3 -m venv venv source venv/bin/activate pip install -r requirements.txt

3.4 venv 的局限

局限说明解决方案
不能管理 Python 版本venv 继承创建时的 Python配合 pyenv 或改用 Conda
编译安装慢NumPy/Pandas 从源码编译改用 Conda 预编译包
非 Python 依赖需要系统安装 libssl-dev 等Conda 统一管理
跨平台锁定requirements.txt 可能平台相关Conda environment.yml

四、virtualenv:venv 的增强版

4.1 与 venv 的区别

展开代码
# 安装 pip install virtualenv # 更多功能 virtualenv myenv virtualenv myenv -p python3.10 # 指定解释器 virtualenv myenv --no-setuptools # 不安装 setuptools virtualenv myenv --always-copy # 复制而非软链接(适合网络文件系统) virtualenv myenv --relocatable # 可迁移(实验性)

4.2 何时还用 virtualenv?

  • Python 2.7 遗留项目(venv 不支持)
  • 需要 --relocatable 迁移环境
  • 特定企业环境兼容性要求

结论:新项目直接用 venv,无需安装 virtualenv。


五、Poetry:现代 Python 项目管理

5.1 核心优势

展开代码
# 安装 curl -sSL https://install.python-poetry.org | python3 - # 初始化项目(自动生成 pyproject.toml) poetry new myproject cd myproject # 或现有项目初始化 poetry init # pyproject.toml 示例 [tool.poetry] name = "myproject" version = "0.1.0" description = "" authors = ["Your Name <you@example.com>"] readme = "README.md" [tool.poetry.dependencies] python = "^3.10" flask = "^2.3" sqlalchemy = "^2.0" [tool.poetry.group.dev.dependencies] pytest = "^7.4" black = "^23.0" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api"

5.2 工作流对比

操作pip + venvPoetry
创建环境python -m venv venvpoetry install(自动创建)
激活环境source venv/bin/activatepoetry shellpoetry run
添加依赖pip install flaskpoetry add flask
添加开发依赖pip install pytestpoetry add --group dev pytest
锁定版本pip freeze > requirements.txt自动生成 poetry.lock
安装生产依赖pip install -r requirements.txtpoetry install --only main

5.3 Poetry 的局限

  • 不支持 Conda 生态:PyTorch/TensorFlow 等 ML 库安装复杂
  • PEP 标准演进中pyproject.toml 工具链仍在成熟
  • 非 Python 依赖:仍需系统或 Conda 安装

六、Miniconda/Conda:数据科学与生产首选

6.1 为什么数据科学必选 Conda?

展开代码
# 场景:安装 PyTorch(对比痛苦程度) # ===== pip 方案(可能失败)===== pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 错误 1:CUDA 版本不匹配 # 错误 2:缺少系统库 libcuda.so # 错误 3:编译 PyTorch 从源码,2小时+ # 错误 4:运行时 segfault # ===== Conda 方案(一键成功)===== conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia # ✓ 自动下载预编译 CUDA 版本 # ✓ 自动匹配系统 CUDA 驱动 # ✓ 自动安装 cudatoolkit # ✓ 5 分钟完成

6.2 Miniconda 完整安装

展开代码
# 快速安装 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3 echo 'export PATH=/opt/miniconda3/bin:$PATH' >> ~/.bashrc source ~/.bashrc conda init --all

6.3 Conda 环境 vs Python venv 对比

特性Python venvConda 环境
创建命令python -m venv myenvconda create -n myenv python=3.10
Python 版本继承系统,无法更换conda install python=3.9/3.10/3.11
包来源PyPI (pip)Conda 通道 + PyPI
二进制包部分(wheel)全面预编译(MKL/CUDA优化)
非 Python 包❌ 不支持✅ R, Node, C++ 库
环境位置项目目录或 ~/.venvs/opt/miniconda3/envs/ 或指定路径
导出文件requirements.txtenvironment.yml(更完整)
激活速度稍慢(需执行 conda 脚本)

6.4 Conda 环境实战

展开代码
# 创建 ML 开发环境 conda create -n ml-dev python=3.10 -y conda activate ml-dev # 安装数据科学栈(预编译优化版) conda install numpy scipy pandas scikit-learn matplotlib seaborn \ -c conda-forge # 安装 PyTorch GPU 版(自动匹配 CUDA) conda install pytorch torchvision torchaudio pytorch-cuda=11.8 \ -c pytorch -c nvidia # 安装 Jupyter conda install jupyterlab ipykernel python -m ipykernel install --user --name=ml-dev --display-name="Python (ML Dev)" # 导出环境(含通道信息,跨平台可复现) conda env export > environment.yml # 生产环境重建 conda env create -f environment.yml -n ml-prod

6.5 Conda 与 Pip 混合最佳实践

展开代码
# 原则:底层依赖用 Conda,纯 Python 包用 pip # 步骤 1:Conda 安装基础科学计算 conda create -n myproject python=3.10 conda activate myproject conda install numpy scipy pandas scikit-learn # 步骤 2:Conda 安装深度学习框架 conda install pytorch torchvision -c pytorch # 步骤 3:pip 安装 Conda 没有的包 pip install transformers datasets accelerate # 步骤 4:锁定完整环境 conda env export --from-history > conda-requirements.yml # Conda 包 pip list --format=freeze > pip-requirements.txt # pip 包 # 或使用 conda-lock 精确锁定 conda install conda-lock conda-lock -f environment.yml -p linux-64

七、工具选型决策树

展开代码
开始 │ ▼ 需要管理 Python 版本?(如 3.9/3.10/3.11 切换) │ ├──► 是 ──► 需要非 Python 依赖?(CUDA/MKL/R) │ │ │ ├──► 是 ──► 数据科学/ML 项目? │ │ │ │ │ ├──► 是 ──► **Miniconda** ⭐ │ │ │ │ │ └──► 否 ──► Conda 或 Poetry + pyenv │ │ │ └──► 否 ──► Poetry + pyenv 或 uv │ └──► 否 ──► 简单项目,标准库够用? │ ├──► 是 ──► **venv**(Python 3.3+ 内置) │ └──► 否 ──► 需要现代依赖解析? │ ├──► 是 ──► **Poetry** │ └──► 否 ──► virtualenv(兼容旧版)

八、生产环境最佳实践

8.1 Docker 中的虚拟环境

展开代码
# 方案 1:多阶段构建 + Poetry(推荐) FROM python:3.10-slim as builder WORKDIR /app RUN pip install poetry COPY pyproject.toml poetry.lock ./ RUN poetry config virtualenvs.create false \ && poetry install --no-dev --no-interaction --no-ansi FROM python:3.10-slim COPY --from=builder /usr/local/lib/python3.10/site-packages /usr/local/lib/python3.10/site-packages COPY . /app WORKDIR /app CMD ["python", "app.py"] # 方案 2:Miniconda(数据科学) FROM continuumio/miniconda3:latest COPY environment.yml . RUN conda env create -f environment.yml SHELL ["conda", "run", "-n", "myenv", "/bin/bash", "-c"] COPY . /app WORKDIR /app CMD ["conda", "run", "--no-capture-output", "-n", "myenv", "python", "app.py"]

8.2 CI/CD 中的环境管理

展开代码
# GitHub Actions:矩阵测试多 Python 版本 strategy: matrix: python-version: ["3.9", "3.10", "3.11"] tool: ["venv", "conda", "poetry"] include: - tool: venv setup: | python -m venv venv source venv/bin/activate pip install -r requirements.txt - tool: conda setup: | conda create -n test python=${{ matrix.python-version }} -y conda activate test conda env update -f environment.yml - tool: poetry setup: | pip install poetry poetry install

九、完整命令速查表

场景venvCondaPoetry
创建python -m venv myenvconda create -n myenv python=3.10poetry init
激活source myenv/bin/activateconda activate myenvpoetry shell
安装包pip install pkgconda install pkgpoetry add pkg
安装开发包pip install pytestconda install pytestpoetry add --group dev pytest
锁定pip freeze > req.txtconda env export > env.yml自动 poetry.lock
重建pip install -r req.txtconda env create -f env.ymlpoetry install
删除rm -rf myenvconda remove -n myenv --allrm -rf .venv
Python 版本固定conda install python=3.xpoetry env use 3.x

本文作者:zzz

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!