3、环境搭建与工具链:安装 fonttools、brotli、zopfli 等 Python 库,配置开发环境

说实话,很多做字体优化的朋友,最后都栽在了环境配置上。不是库装不上,就是版本冲突,折腾半天还没开始干活。我刚开始搞字体压缩那会儿,也踩过不少坑。这一章咱们就把环境彻底搞定,后面写代码、跑脚本才能一路顺畅。

3.1 整体架构:我们要装什么?

先理清楚整个工具链长什么样。你想想看,字体压缩不是单一工具能搞定的,它是一条流水线:

  • fonttools —— 核心操作库,负责读写、解析、修改字体文件
  • brotli —— 压缩算法库,用于 WOFF2 的压缩
  • zopfli —— 另一种压缩算法,适合生成更小的 WOFF 文件
  • Python 3.8+ —— 所有工具的运行环境

它们之间的关系,我画了张图,一看就明白:

字体压缩工具链架构图 字体压缩工具链架构 原始字体文件 Python 3.8+ 运行环境 fonttools 解析/修改/子集化 brotli WOFF2 压缩 zopfli WOFF 优化压缩 压缩后的字体文件 fonttools 依赖 brotli 和 zopfli 作为压缩后端

说白了,fonttools 是主角,brotli 和 zopfli 是它的左膀右臂。fonttools 负责处理字体内部结构,压缩工作交给后两者。

3.2 安装 Python 环境

如果你机器上还没装 Python,先去官网下载 3.8 以上版本。我个人习惯用 pyenv 管理多版本,但初学者直接用系统安装包也行。

装完之后,验证一下:

python --version
# 输出示例:Python 3.10.12

pip --version
# 输出示例:pip 23.2.1 from ...
注意: 如果你同时装了 Python 2 和 Python 3,可能需要用 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__)"
小技巧: 如果你在 Windows 上遇到编译错误,试试装预编译的 wheel 包: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 命令行。这样调试效率最高。