Appearance
19|虚拟环境与依赖
Python 项目经常依赖第三方库。不同项目需要的库版本不同,装到系统 Python 里会互相冲突。虚拟环境给每个项目独立的包安装空间,解决这个问题。
一、venv
Python 自带 venv 模块,无需额外安装:
bash
# 创建虚拟环境
python3 -m venv .venv
# 激活(Linux/macOS)
source .venv/bin/activate
# 激活(Windows PowerShell)
.venv\Scripts\Activate.ps1激活后,命令行提示符前会出现 (.venv),表示当前在虚拟环境中。此时 python 和 pip 指向虚拟环境里的版本,不是系统的。
bash
which python # 显示 .venv/bin/python
pip install requests退出虚拟环境:
bash
deactivate二、pip
pip 是 Python 的包管理器,从 PyPI(Python Package Index)下载和安装第三方库。
bash
pip install requests # 安装最新版
pip install requests==2.28.1 # 安装指定版本
pip install requests>=2.28,<3.0 # 安装版本范围内的最新版
pip install -r requirements.txt # 从文件批量安装查看已安装包:
bash
pip list
pip show requests # 查看单个包的详细信息卸载:
bash
pip uninstall requests三、requirements.txt
记录项目依赖的标准方式是 requirements.txt:
text
requests>=2.28,<3.0
pyyaml==6.0.1
paramiko每行一个包,可以指定版本约束:
==:精确版本>=:最低版本<=:最高版本~=:兼容版本(如~=2.28.0表示2.28.0到2.29.0之间)
生成当前环境的依赖列表:
bash
pip freeze > requirements.txtpip freeze 输出所有已安装包(包括间接依赖)的精确版本。在新环境恢复:
bash
pip install -r requirements.txt四、uv
uv 是用 Rust 编写的新一代 Python 包管理器,兼容 pip 和 venv,但速度更快、功能更整合。
安装 uv:
bash
curl -LsSf https://astral.sh/uv/install.sh | sh创建项目并管理依赖:
bash
uv init myproject
cd myproject
uv add requests # 安装并写入 pyproject.toml
uv add requests==2.28.1 # 安装指定版本
uv remove requests # 卸载
uv sync # 按 pyproject.toml 和 uv.lock 恢复环境
uv run python script.py # 用项目环境执行脚本uv 把虚拟环境、依赖安装、锁文件管理整合到一起。uv run 自动使用项目环境,不需要手动 source .venv/bin/activate。
pyproject.toml 是 modern Python 项目的标准配置文件:
toml
[project]
name = "myproject"
version = "0.1.0"
dependencies = [
"requests>=2.28",
]uv.lock 记录精确版本,保证不同机器上安装的依赖完全一致。
五、依赖管理策略
直接依赖 vs 间接依赖
直接依赖:项目代码里直接 import 的包。间接依赖:直接依赖所依赖的包。
requirements.txt 通常只记录直接依赖,让 pip 自己解析间接依赖。pip freeze 记录全部(包括间接依赖),文件很长但环境完全一致。
两种策略各有适用场景:
- 只记直接依赖:
requirements.txt简洁,升级更灵活 - 记全部依赖:环境完全一致,但升级时需要手动处理
开发依赖
只在开发和测试时用的包(如测试框架、代码格式化工具),不应该出现在生产环境:
toml
[project.optional-dependencies]
dev = ["pytest", "black", "ruff"]bash
pip install -e ".[dev]" # 安装项目 + 开发依赖六、常见问题
| 问题 | 原因 | 解决 |
|---|---|---|
ModuleNotFoundError | 包装到了别的环境 | 确认激活了正确的虚拟环境,which python 检查路径 |
| 权限错误 | 用系统 pip 安装 | 改用虚拟环境,或加 --user |
| 版本冲突 | 不同包依赖同一个包的不同版本 | 用虚拟环境隔离,或升级/降级相关包 |
| 编译失败 | 包需要 C 编译器 | 安装 python3-dev/build-essential,或找预编译的 wheel |
七、配置国内镜像
PyPI 下载慢时,配置国内镜像:
bash
# pip 全局配置
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# uv 临时使用
uv add requests --default-index https://pypi.tuna.tsinghua.edu.cn/simple
# uv 环境变量
export UV_DEFAULT_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple常用镜像源:清华、阿里云、腾讯云、华为云。https 镜像通常不需要额外配置 trusted-host。
记忆锚点:python3 -m venv .venv 创建虚拟环境;source .venv/bin/activate 激活,deactivate 退出;pip install 安装,pip freeze 导出;requirements.txt 记录依赖,pip install -r 恢复;uv 整合环境创建、依赖安装和锁文件;pyproject.toml 是现代项目的标准配置;直接依赖和间接依赖分开管理;国内镜像加速下载。