包管理与虚拟环境
问题
Python 有哪些包管理工具?虚拟环境为什么重要?
答案
虚拟环境
虚拟环境隔离项目依赖,避免不同项目的包版本冲突:
# 内置 venv
python -m venv .venv
source .venv/bin/activate # Linux/macOS
.venv\Scripts\activate # Windows
# 安装依赖
pip install flask
pip freeze > requirements.txt
pip install -r requirements.txt
包管理工具对比
| 工具 | 特点 | 锁文件 | 速度 |
|---|---|---|---|
| pip + venv | 内置,最基础 | 无(requirements.txt 非严格锁定) | 中 |
| Poetry | 依赖解析、发布、虚拟环境一体 | poetry.lock | 中 |
| uv | Rust 实现,极速 | uv.lock | 极快(10-100x) |
| PDM | PEP 582、现代标准 | pdm.lock | 快 |
| Pipenv | pip + virtualenv 封装 | Pipfile.lock | 慢 |
Poetry
# 初始化项目
poetry init
# 添加依赖
poetry add flask
poetry add --group dev pytest black
# 安装所有依赖
poetry install
# 运行命令
poetry run python app.py
pyproject.toml
[tool.poetry]
name = "myproject"
version = "0.1.0"
python = "^3.11"
[tool.poetry.dependencies]
flask = "^3.0"
[tool.poetry.group.dev.dependencies]
pytest = "^8.0"
black = "^24.0"
uv(2024 年新星)
# 安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# 创建项目
uv init myproject
cd myproject
# 添加依赖(极速)
uv add flask
uv add --dev pytest ruff
# 运行
uv run python app.py
# 同步依赖
uv sync
常见面试问题
Q1: requirements.txt 和 lock 文件的区别?
答案:
requirements.txt:通常记录直接依赖,版本范围宽泛(flask>=3.0)- Lock 文件(
poetry.lock、uv.lock):锁定所有依赖(包括间接依赖)的精确版本和 hash
生产环境应使用 lock 文件确保可复现构建。
Q2: 推荐哪个包管理器?
答案:
- 新项目首选 uv——速度极快,兼容 pip 生态
- 已有项目用 Poetry 的继续用 Poetry
- 简单脚本用 pip + venv 足够
- 避免使用 Pipenv(维护缓慢、速度差)
Q3: pyproject.toml 是什么?
答案:
PEP 518 定义的项目元数据文件,替代 setup.py/setup.cfg。所有现代工具(Poetry、uv、Ruff、pytest)都支持在 pyproject.toml 中配置。