
Python项目怎么管理依赖
一、依赖文件结构规范
requirements/
├── base.txt # 所有环境基础依赖
├── dev.txt # 开发环境专用依赖
├── prod.txt # 生产环境专用依赖
└── constraints.txt # 版本约束文件(可选)
二、各文件具体内容及作用
1. base.txt(跨环境基础依赖)
# 核心框架
Django==4.2.3
djangorestframework==3.14.0
# 数据库驱动
psycopg2-binary==2.9.6
redis==4.5.5
# 异步支持
celery==5.3.1
# 严格指定版本格式
sqlalchemy==1.4.46 \
--hash=sha256:abc123... \
--hash=sha256:def456...
最佳实践:
使用双等号固定精确版本
对关键依赖添加hash校验(通过
pip hash
生成)按功能模块分组注释
2. dev.txt(开发环境扩展)
-r base.txt # 继承基础依赖
# 测试框架
pytest==7.3.1
pytest-django==4.5.2
factory-boy==3.2.1
# 代码质量
flake8==6.0.0
black==23.3.0
mypy==1.3.0
# 文档生成
sphinx==6.1.3
# 本地调试
ipython==8.12.0
debugpy==1.6.7
3. prod.txt(生产环境优化)
-r base.txt # 继承基础依赖
# 生产专用依赖
gunicorn==20.1.0
uvicorn==0.22.0
sentry-sdk==1.25.1
# 性能优化
psutil==5.9.5
orjson==3.8.12
# 安全扫描
bandit==1.7.5
4. constraints.txt(跨环境版本约束)
# 统一版本约束
django==4.2.3
requests==2.30.0
sqlalchemy==1.4.46
三、具体操作流程
传统方式(requirements.txt)
初始化依赖:
python -m venv .venv
source .venv/bin/activate
# 安装开发依赖
pip install -r requirements/dev.txt
更新依赖树:
# 安装新包
pip install package==x.x.x
# 生成锁定文件
pip freeze --exclude-editable > requirements/base.txt
# 分离生产依赖
pip freeze --exclude-editable | grep -vE 'pytest|mypy' > requirements/prod.txt
生产环境安装:
pip install -r requirements/prod.txt --no-deps
现代方式(推荐使用Poetry)
初始化配置:
poetry init # 生成pyproject.toml
pyproject.toml示例:
[tool.poetry]
name = "myproject"
version = "0.1.0"
[tool.poetry.dependencies]
python = "^3.9"
django = "4.2.3"
psycopg2 = {version = "2.9.6", extras = ["binary"]}
[tool.poetry.dev-dependencies]
pytest = "7.3.1"
black = "23.3.0"
[tool.poetry.group.prod.dependencies]
gunicorn = "20.1.0"
常用命令:
# 添加生产依赖
poetry add django@4.2.3
# 添加开发依赖
poetry add --group dev pytest
# 安装全部依赖
poetry install
# 仅安装生产依赖
poetry install --only main
# 生成锁定文件
poetry lock # 生成poetry.lock
# 导出requirements.txt
poetry export -f requirements.txt --output requirements/prod.txt --without-hashes
四、版本控制策略
必须纳入版本控制:
pyproject.toml(Poetry)
poetry.lock / pipenv.lock
requirements/*.txt
忽略文件:
虚拟环境目录(.venv/)
pycache/
*.egg-info/
五、多环境管理方案
# 使用环境变量区分
export ENV_MODE=production
# 安装时动态选择
if [ "$ENV_MODE" = "production" ]; then
pip install -r requirements/prod.txt
else
pip install -r requirements/dev.txt
fi
# 使用direnv工具(推荐)
# .envrc文件内容
layout poetry
export DJANGO_SETTINGS_MODULE=config.settings.${ENV:-dev}
六、安全审计流程
定期扫描:
pip-audit # 官方漏洞扫描
safety check -r requirements/prod.txt
更新策略:
# 半自动更新
pip list --outdated
poetry update --dry-run
# 批量升级命令
poetry update package1 package2
七、企业级最佳实践
分层依赖管理:
基础层:OS级依赖(Dockerfile中定义)
应用层:Python包依赖(poetry管理)
服务层:基础设施依赖(Kubernetes Helm Charts)
私有源集成:
# poetry私有源配置
[[tool.poetry.source]]
name = "private"
url = "https://pypi.example.com/simple"
default = true
依赖矩阵测试:
# GitHub Actions示例
jobs:
test:
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11"]
django-version: ["4.2.3", "4.1.9"]
steps:
- run: poetry add django@${{ matrix.django-version }}
建议结合Docker镜像构建,实现完全可重复的依赖安装:
FROM python:3.9-slim
# 优先安装系统依赖
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev
# 使用poetry安装Python依赖
RUN pip install poetry
COPY pyproject.toml poetry.lock ./
RUN poetry config virtualenvs.create false \
&& poetry install --no-dev --no-interaction --no-ansi
通过这种分级管理方案,既能保证开发灵活性,又能确保生产环境的稳定性。建议优先采用Poetry等现代化工具,其依赖解析算法(使用SAT solver)能有效处理复杂依赖关系,避免传统requirements.txt容易出现的版本冲突问题。