跳转至

01 - 虚拟环境管理

学习时间: 1小时 重要性: ⭐⭐⭐⭐⭐ 项目隔离必备


🎯 学习目标

  • 理解为什么需要虚拟环境
  • 掌握conda和venv的基本使用
  • 了解poetry等现代依赖管理工具
  • 掌握uv——新一代超快Python包管理器
  • 学会管理项目依赖

📦 为什么需要虚拟环境?

问题场景

Bash
# 项目A需要tensorflow 2.0
# 项目B需要tensorflow 1.x
# 没有虚拟环境?冲突!

# 另一个常见问题:
# 项目A需要requests 2.25.0
# 项目B需要requests 2.28.0
# 全局安装只能有一个版本

解决方案

每个项目独立环境,互不干扰:

Text Only
项目A环境: Python 3.11 + TensorFlow 2.16 + requests 2.32.0
项目B环境: Python 3.10 + PyTorch 2.2 + requests 2.31.0
项目C环境: Python 3.12 + PyTorch 2.4 + 其他依赖

🐍 Conda使用(推荐)

基础命令

Bash
# 创建环境
conda create -n myproject python=3.11

# 创建环境时指定多个包
conda create -n datascience python=3.11 numpy pandas matplotlib

# 激活环境
conda activate myproject

# 退出环境
conda deactivate

# 安装包
conda install numpy pandas
pip install package-name  # conda没有的包可以用pip

# 查看已安装的包
conda list

# 更新包
conda update numpy

# 删除包
conda remove numpy

环境管理

Bash
# 列出所有环境
conda env list

# 克隆环境
conda create -n new_env --clone old_env

# 删除环境
conda env remove -n myproject

# 导出环境(精确版本)
conda env export > environment.yml

# 导出环境(仅显式安装的包)
conda env export --from-history > environment.yml

# 从文件创建环境
conda env create -f environment.yml

environment.yml示例

YAML
name: myproject
channels:
  - defaults
  - conda-forge
dependencies:
  - python=3.11
  - numpy=1.24
  - pandas=2.0
  - matplotlib=3.7
  - pip
  - pip:
    - requests==2.31.0
    - python-dotenv==1.0.0

🐍 venv使用(Python内置)

基础命令

Bash
# 创建虚拟环境
python -m venv myenv

# 激活环境(Windows)
myenv\Scripts\activate

# 激活环境(Linux/Mac)
source myenv/bin/activate

# 退出环境
deactivate

# 删除环境(直接删除文件夹)
rm -rf myenv  # Linux/Mac
rmdir /s myenv  # Windows

依赖管理

Bash
# 生成requirements.txt
pip freeze > requirements.txt

# 安装依赖
pip install -r requirements.txt

# pip 不支持区分生产/开发依赖,需使用独立的文件管理
pip install -r requirements.txt          # 生产依赖
pip install -r requirements-dev.txt      # 开发依赖(可选)

requirements.txt示例

Text Only
# 生产依赖
numpy>=1.24.0
pandas>=2.0.0
requests==2.31.0

# 开发依赖(可选)
pytest>=7.0.0
black>=23.0.0
flake8>=6.0.0

📦 Poetry(现代依赖管理)

安装

Bash
# 安装poetry
pip install poetry

# 或使用官方安装脚本
curl -sSL https://install.python-poetry.org | python3 -

基础使用

Bash
# 创建新项目
poetry new myproject
cd myproject

# 在现有项目初始化
poetry init

# 添加依赖
poetry add numpy pandas

# 添加开发依赖
poetry add --group dev pytest black

# 安装所有依赖
poetry install

# 激活shell
poetry shell

# 运行命令
poetry run python script.py

# 更新依赖
poetry update

# 导出requirements.txt
poetry export -f requirements.txt --output requirements.txt

pyproject.toml示例

TOML
[tool.poetry]
name = "myproject"
version = "0.1.0"
description = "My awesome project"
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.11"
numpy = "^1.24.0"
pandas = "^2.0.0"

[tool.poetry.group.dev.dependencies]
pytest = "^7.0.0"
black = "^23.0.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

⚡ uv(新一代超快包管理器)

uv 是由 Astral(Ruff 的开发团队)用 Rust 开发的 Python 包管理器,速度比 pip 快 10-100 倍,旨在替代 pip、pip-tools、virtualenv、poetry、pyenv 等多个工具。

安装

Bash
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows (PowerShell)
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

# 通过 pip 安装(也可以,但推荐上面的独立安装方式)
pip install uv

# 通过 Homebrew
brew install uv

Python 版本管理(替代 pyenv)

Bash
# 查看可安装的 Python 版本
uv python list

# 安装指定版本的 Python
uv python install 3.12

# 安装多个版本
uv python install 3.11 3.12

# 固定项目使用的 Python 版本
uv python pin 3.12

项目管理(替代 poetry / pip-tools)

Bash
# 创建新项目(自动生成 pyproject.toml 和虚拟环境)
uv init myproject
cd myproject

# 在现有项目初始化
uv init

# 添加依赖
uv add numpy pandas

# 添加开发依赖
uv add --dev pytest black ruff

# 移除依赖
uv remove pandas

# 同步环境(安装 lock 文件中的所有依赖)
uv sync

# 更新所有依赖
uv lock --upgrade

# 运行命令(自动使用项目虚拟环境)
uv run python script.py
uv run pytest

虚拟环境管理(替代 virtualenv / venv)

Bash
# 创建虚拟环境
uv venv

# 指定 Python 版本创建
uv venv --python 3.12

# 指定目录名
uv venv .venv

# 激活(与 venv 相同)
# Windows:
.venv\Scripts\activate
# Linux/Mac:
source .venv/bin/activate

pip 兼容模式(替代 pip)

Bash
# 用法与 pip 几乎完全一致,只是快得多
uv pip install numpy pandas
uv pip install -r requirements.txt
uv pip uninstall numpy
uv pip freeze > requirements.txt
uv pip list
uv pip show numpy

# 编译锁定文件(替代 pip-tools)
uv pip compile requirements.in -o requirements.txt
uv pip sync requirements.txt

一次性运行工具(替代 pipx)

Bash
# 无需安装,直接运行 CLI 工具
uv tool run ruff check .
uvx ruff check .          # uvx 是 uv tool run 的简写

uvx black --check .
uvx jupyter lab
uvx cookiecutter gh:audreyfeldroy/cookiecutter-pypackage

pyproject.toml 示例(uv 项目)

TOML
[project]
name = "myproject"
version = "0.1.0"
description = "My awesome project"
requires-python = ">=3.11"
dependencies = [
    "numpy>=1.24.0",
    "pandas>=2.0.0",
    "requests>=2.31.0",
]

[dependency-groups]
dev = [
    "pytest>=7.0.0",
    "black>=23.0.0",
    "ruff>=0.1.0",
]

[tool.uv]
dev-dependencies = [
    "pytest>=7.0.0",
    "black>=23.0.0",
]

uv vs 其他工具速度对比

Text Only
安装 numpy + pandas + matplotlib(冷缓存):
  pip      : ~15s
  poetry   : ~12s
  uv       : ~1.5s   ← 快 10 倍

创建虚拟环境:
  python -m venv : ~3s
  uv venv        : ~0.01s  ← 几乎瞬间

工具选择建议

场景 推荐工具
快速原型 / 脚本开发 uv(最快,零配置)
数据科学 / ML 项目 conda(管理非 Python 依赖如 CUDA)
库开发 / 发布 PyPI uvpoetry
旧项目维护 venv + pip(兼容性最好)
团队标准化新项目 uv(速度快,标准化程度高)
需要运行一次性 CLI 工具 uvx(替代 pipx)

💡 最佳实践

1. 项目结构

Text Only
myproject/
├── src/                    # 源代码
│   └── mypackage/
├── tests/                  # 测试代码
├── docs/                   # 文档
├── notebooks/              # Jupyter notebooks
├── environment.yml         # conda环境文件
├── requirements.txt        # pip依赖文件
├── requirements-dev.txt    # 开发依赖
├── pyproject.toml          # 现代Python项目配置
└── README.md

2. 依赖管理策略

Bash
# 策略1:锁定版本(生产环境推荐)
# requirements.txt
numpy==1.24.3
pandas==2.0.2

# 策略2:最小版本约束
# requirements.txt
numpy>=1.24.0
pandas>=2.0.0,<3.0.0

# 策略3:使用poetry(推荐新项目)
# 自动管理依赖和虚拟环境

3. 环境切换脚本

Bash
# setup.sh - 快速设置开发环境
#!/bin/bash

# 创建环境
conda env create -f environment.yml -n myproject

# 激活环境
conda activate myproject

# 安装预提交钩子
pre-commit install

echo "环境设置完成!"

📝 练习

练习1: 创建项目环境

Bash
# 1. 为你的数据分析项目创建一个conda环境
# 2. 安装numpy, pandas, matplotlib, jupyter
# 3. 导出environment.yml
# 4. 删除环境并重新从文件创建

练习2: 依赖管理

Bash
# 1. 创建一个requirements.txt,包含3个包
# 2. 创建虚拟环境并安装依赖
# 3. 添加一个新依赖并更新requirements.txt

练习3: 尝试Poetry

Bash
# 1. 安装poetry
# 2. 创建一个新项目
# 3. 添加几个依赖
# 4. 运行一个简单的Python脚本

练习4: 体验uv的速度

Bash
# 1. 安装uv
# 2. 使用 uv init 创建一个新项目
# 3. 用 uv add 添加 numpy, pandas, matplotlib
# 4. 用 uv run python -c "import numpy; print(numpy.__version__)" 验证
# 5. 用 uvx ruff check . 体验一次性工具运行
# 6. 对比 pip install 和 uv pip install 的速度差异

🎯 自我检查

  • 理解虚拟环境的作用
  • 会创建和管理conda环境
  • 会使用venv
  • 会管理项目依赖(requirements.txt)
  • 了解poetry的基本使用
  • 掌握uv的项目管理与包安装
  • 了解不同场景下的工具选择

📚 延伸阅读


下一步: 02 - 代码调试