25 分钟
工程化

项目结构与依赖管理

工业级 Python 项目的目录结构、pyproject.toml 和依赖管理

  • 掌握 src/ 布局和标准项目结构
  • 理解 pyproject.toml (PEP 517/518)
  • 掌握虚拟环境和依赖锁定
  • 了解 uv/poetry 等现代工具

项目结构与依赖管理

工业级 Python 项目的结构不是随便建几个文件夹,有明确的约定和最佳实践。

标准项目结构

示例代码(可运行)

pyproject.toml — 现代 Python 项目的核心

示例代码(可运行)

虚拟环境与依赖管理工具

示例代码(可运行)
🐍资深工程师经验谈

依赖管理的核心原则:生产依赖和开发依赖分离([project.optional-dependencies])永远提交 lock 文件(uv.lock/poetry.lock),保证可复现构建用 ~= 或 >=,< 约束版本范围,不要用 == 锁死所有传递依赖定期用 pip-audit 扫漏洞不要在虚拟环境外 pip installrequirements.txt 适合应用,pyproject.toml 适合库

requirements.txt 最佳实践

Python
# 应用项目的 requirements 分层
# requirements/base.txt - 基础依赖
#   httpx>=0.27
#   pydantic>=2.0
#
# requirements/dev.txt - 开发依赖
#   -r base.txt
#   pytest>=8
#   ruff>=0.5
#
# requirements/prod.txt - 生产依赖
#   -r base.txt
#   gunicorn>=21
#
# 锁定完整版本(可复现):
# pip freeze > requirements.lock.txt
# 或用 uv pip compile 生成带哈希的锁定文件

# 安装:
# pip install -r requirements/dev.txt
# uv pip install -r requirements/dev.txt  # 快 10-100 倍(官方基准区间)

print("生产环境用锁定版本,开发环境用范围版本")

版本号与依赖范围

理解版本号和依赖范围

示例
# SemVer: MAJOR.MINOR.PATCH
# 1.2.3 → 主版本(不兼容变更).次版本(新功能兼容).修订(bug修复)

# 版本范围符号:
# >=1.0,<2.0   1.x 最新版(推荐)
# ~=1.2        等价于 >=1.2,<2.0
# ==1.2.3      精确版本(lock文件用)
# >=1.0        1.0及以上(危险,可能引入不兼容)
# !=1.5        排除特定版本

# ^1.2.3 (poetry/uv) 等价于 >=1.2.3,<2.0.0
# ~1.2.3 (poetry/uv) 等价于 >=1.2.3,<1.3.0
选择题

src/ 布局的主要好处是?

选择题

2024年最快的 Python 包管理器是?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

常见根因:内存泄漏导致 OOM 被系统杀掉、连接/文件句柄没关闭耗尽、事件循环里混入同步阻塞、未捕获异常让进程退出。12-Factor App 的建议很实用:配置环境化、日志当成事件流输出、进程保持无状态(状态放数据库/缓存),这样才能随时加副本做水平扩展。

挑战任务

项目结构挑战

简单+50 XP

写一个函数,输出标准项目结构的创建步骤(模拟脚手架)。

项目结构挑战
2 个测试用例

课后作业

依赖解析器

中等+20 XP

写一个 parse_requirements 函数,解析 requirements.txt 格式的依赖列表,返回包名列表。

依赖解析器
1 个测试用例