3、环境搭建与工具链:安装 fonttools、brotli、zopfli 等 Python 库,配置开发环境
说实话,很多做字体优化的朋友,最后都栽在了环境配置上。不是库装不上,就是版本冲突,折腾半天还没开始干活。我刚开始搞字体压缩那会儿,也踩过不少坑。这一章咱们就把环境彻底搞定,后面写代码、跑脚本才能一路顺畅。
3.1 整体架构:我们要装什么?
先理清楚整个工具链长什么样。你想想看,字体压缩不是单一工具能搞定的,它是一条流水线:
- fonttools —— 核心操作库,负责读写、解析、修改字体文件
- brotli —— 压缩算法库,用于 WOFF2 的压缩
- zopfli —— 另一种压缩算法,适合生成更小的 WOFF 文件
- Python 3.8+ —— 所有工具的运行环境
它们之间的关系,我画了张图,一看就明白:
说白了,fonttools 是主角,brotli 和 zopfli 是它的左膀右臂。fonttools 负责处理字体内部结构,压缩工作交给后两者。
3.2 安装 Python 环境
如果你机器上还没装 Python,先去官网下载 3.8 以上版本。我个人习惯用 pyenv 管理多版本,但初学者直接用系统安装包也行。
装完之后,验证一下:
python --version
# 输出示例:Python 3.10.12
pip --version
# 输出示例:pip 23.2.1 from ...
python3 和 pip3 命令。我曾经在一台旧 Mac 上折腾了半天,才发现默认的 python 指向的是 2.7 版本。
3.3 安装 fonttools
fonttools 是咱们的主力库。安装命令很简单:
pip install fonttools
装完之后,我建议你顺手装几个扩展模块,后面子集化、WOFF2 转换都会用到:
pip install fonttools[woff,unicode,ufo,lxml]
这些扩展的作用:
| 扩展名 | 作用 | 什么时候用 |
|---|---|---|
woff |
支持 WOFF/WOFF2 读写 | 做 Web 字体压缩时必装 |
unicode |
Unicode 字符集处理 | 做字符子集化时用到 |
ufo |
UFO 格式支持 | 跟设计工具交换数据时 |
lxml |
XML 解析加速 | 处理 SVG 表或自定义表时 |
验证安装是否成功:
python -c "from fontTools.ttLib import TTFont; print('fonttools OK')"
如果没报错,说明装好了。
3.4 安装 brotli
brotli 是 Google 开源的压缩算法,WOFF2 规范里指定用它。安装方式:
pip install brotli
嗯,这里要注意:brotli 有两个版本,brotli 和 brotlicffi。前者是纯 Python 实现,后者是 C 扩展。我建议装 brotli,兼容性更好:
pip install brotli
# 验证
python -c "import brotli; print(brotli.__version__)"
pip install brotli --only-binary=:all:
3.5 安装 zopfli
zopfli 同样是 Google 出品,压缩率比常规 gzip 高 3-8%。它主要用于生成更小的 WOFF 文件:
pip install zopfli
验证:
python -c "import zopfli; print('zopfli OK')"
我在项目中遇到过一个问题:zopfli 压缩速度比较慢,尤其是大字体文件。所以生产环境里,我通常只在构建阶段用 zopfli,开发调试时用普通 gzip 就够了。
3.6 一次性安装所有依赖
嫌一个个装麻烦?可以用 requirements.txt 搞定。创建一个文件,写入:
fonttools[woff,unicode,ufo,lxml]
brotli
zopfli
然后执行:
pip install -r requirements.txt
这样一次装完,省心。
3.7 验证整个工具链
装完之后,跑个完整的测试脚本,确保所有组件能协同工作:
import sys
from fontTools.ttLib import TTFont
import brotli
import zopfli
print("Python 版本:", sys.version)
print("fonttools: OK")
print("brotli:", brotli.__version__)
print("zopfli: OK")
# 测试创建一个简单的字体对象
font = TTFont()
font.setGlyphOrder([".notdef"])
print("TTFont 对象创建成功")
如果所有输出都正常,恭喜你,环境搭好了。
3.8 常见问题与避坑
我整理了几个高频问题,都是我在实战中踩过的:
- pip 安装超时 —— 换国内镜像源:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple fonttools - ImportError: No module named 'fontTools' —— 检查是不是装到了不同的 Python 环境里,用
which python确认 - brotli 编译失败 —— 在 macOS 上装
xcode-select --install,在 Linux 上装build-essential - zopfli 安装后 import 报错 —— 试试
pip install --upgrade zopfli
python -m venv fonttools-env 创建,然后 source fonttools-env/bin/activate 激活。这样不同项目之间不会打架。
3.9 开发工具推荐
除了 Python 库,我还推荐几个辅助工具:
| 工具 | 用途 | 推荐理由 |
|---|---|---|
| VS Code | 代码编辑器 | Python 插件完善,调试方便 |
| fonttools 命令行 | 快速查看字体信息 | ttx -h 就能看到所有子命令 |
| fontview | 预览字体文件 | macOS 自带,Windows 用 FontForge |
我个人习惯在 VS Code 里写 Python 脚本,然后开一个终端窗口随时跑 fonttools 命令行。这样调试效率最高。