Python 现代开发学习笔记

(十八)完整项目的检查与构建

1. 把常用检查串成一个入口

# 项目文件:quality_project/tools/check.py
# 每项检查使用当前解释器;失败就立即返回该项退出状态。
from pathlib import Path
import subprocess
import sys

root = Path(__file__).resolve().parents[1]
commands = [
    ["ruff", "check", "src", "tests"],
    ["ruff", "format", "--check", "src", "tests"],
    ["mypy"],
    ["pytest"],
]
for command in commands:
    print("执行", " ".join(command), flush=True)
    result = subprocess.run([sys.executable, "-m", *command], cwd=root)
    if result.returncode:
        raise SystemExit(result.returncode)
print("所有检查通过")

parents[1] 从 tools/check.py 回到项目根目录,工具因此不依赖调用者当前在哪一层。flush=True 先把步骤名称送出,随后子进程的报告会跟在对应名称之后。

# 第一次使用配套项目:同步环境并运行完整检查。
uv sync --locked
uv run python tools/check.py
# 查看已安装的两种入口,二者指向相同业务。
uv run python -m readingapp --help
uv run reading-log --help

执行顺序是规则检查、排版检查、类型检查与全部测试。定位某次失败时可以单独运行对应工具;确认修正后再回到这个完整入口。

2. 检查构建后的包

可编辑安装读的是工作目录中的源码;交付给其他环境时,还要检查实际生成的分发文件:

# 构建 wheel 与源码分发包,结果写入 dist;不会上传到包索引。
uv run python -m build
# Windows:另建环境,安装生成的 wheel,然后从该环境启动命令。
py -3.12 -m venv .venv-wheel
.\.venv-wheel\Scripts\python.exe -m pip install dist/reading_log_notes-0.1.0-py3-none-any.whl
.\.venv-wheel\Scripts\python.exe -m readingapp --help
.\.venv-wheel\Scripts\reading-log.exe --help

wheel 包含安装所需的业务文件;源码分发包保存构建来源。新环境中的导入位置应该在它自己的 site-packages,不再是工作目录里的 src。若源码运行正常而 wheel 缺少模块,回到包发现配置与构建结果检查。前面的 .venv*/ 同时忽略 .venv 与 .venv-wheel。构建分发文件

可编辑环境从 src 导入,wheel 新环境从 site-packages 导入,再执行同一入口

3. 用一轮完整操作核对持久化

配套 quality_project/data_sample.py 生成书目,接着执行:

# 项目文件:quality_project/data_sample.py
# 使用第五章的格式写入器,创建可供导入的两本书。
from pathlib import Path

from bookdata.json_io import write_json
from bookdata.models import Book

write_json(Path("data/books.json"), [Book("Python", False, ["基础", "语法"]), Book("NumPy")])
print("已生成 data/books.json")
# 每条命令都会启动新的进程,通过相同数据库文件衔接。
uv run python data_sample.py
uv run reading-log import-json data/books.json
uv run reading-log log Python 2026-10-19 20
uv run reading-log log Python 2026-10-20 35
uv run reading-log finish Python
uv run reading-log list --tag 基础
uv run reading-log export-csv data/export.csv

查询得到 1 Python 已读 55分钟,导出的 CSV 保存书名、完成状态与标签;日志仍由数据库保存。查看 logs/reading.log 可以找到完成导入的记录。把导入文件改坏后重跑,终端显示简短错误,文件日志保存调用信息,之后完整检查应继续通过。

笔记正文与全部题解 · Ctrl / ⌘ K