直接运行pip install pillow失败的主因是Pillow依赖系统级图像库(如libjpeg、zlib),在macOS/Linux上易因缺少开发头文件(如jpeglib.h)导致编译失败;Windows则多因环境冲突或权限问题,而非依赖缺失。

pip install pillow 直接运行失败的常见原因
直接敲 pip install pillow 报错,大概率不是命令写错了,而是底层编译环境或依赖缺失。Pillow 不是纯 Python 库,它依赖系统级图像处理库(如 libjpeg、libpng、freetype),在 Windows 上通常由预编译二进制包(.whl)覆盖,但在 macOS 或 Linux 上容易卡在编译阶段。
常见错误现象包括:
ERROR: Could not build wheels for pillowfatal error: jpeglib.h: No such file or directoryzlib not available
解决思路不是硬刚编译,而是优先让 pip 拿到匹配你系统的 wheel 包:
- 确保
pip版本 ≥ 21.0:python -m pip install --upgrade pip - 检查 Python 架构(Intel/Apple Silicon)和版本(3.7+),wheel 包必须三者严格匹配
- 临时换国内镜像源提速并避开网络中断:
pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
Windows 上 pip install pillow 失败后该做什么
Windows 用户遇到 “failed building wheel” 或 “access denied” 类错误,基本不用装系统依赖,问题出在环境隔离或权限上。
- 不要用 CMD 以管理员身份运行——反而可能触发路径权限混乱;改用普通用户权限的 PowerShell 或 Windows Terminal
- 如果已激活虚拟环境,确认没同时在 base 环境里 pip install(
which pip或where pip查路径) - 卸载残留的
PIL(不是pillow):pip uninstall PIL—— Pillow 和 PIL 不能共存,哪怕只留一个 import 就会冲突 - 极少数情况是杀毒软件拦截了 .whl 解压过程,可临时禁用再试
macOS / Linux 下 pip install pillow 缺头文件怎么办
报 jpeglib.h not found 或 freetype/ft2build.h,说明系统缺少开发头文件,pip 无法编译 C 扩展。
- macOS(M1/M2/M3):运行
brew install libjpeg libpng libtiff freetype,再补软链:export PATH="/opt/homebrew/opt/libjpeg/bin:$PATH"(Intel 用户路径为/usr/local) - Ubuntu/Debian:
sudo apt-get install libjpeg-dev libpng-dev libtiff-dev libfreetype6-dev - CentOS/RHEL:
sudo yum install libjpeg-devel libpng-devel libtiff-devel freetype-devel - 装完别忘了重新运行
pip install pillow,不是升级已有安装
验证 pillow 是否真正可用,不止 import 成功
很多人 from PIL import Image 不报错就以为装好了,但实际调用时崩在 Image.open() 或 show() —— 这是因为部分功能依赖外部程序(如 macOS 的 Preview、Windows 的 Photos)或缺失解码器。
- 最简验证代码:
from PIL import Image<br>print(Image.__version__)<br>img = Image.new("RGB", (10, 10), color="red")<br>img.save("/tmp/test.png") - 如果
save()报OSError: encoder jpeg not available,说明 JPEG 支持没编译进去,需回退检查系统依赖是否完整安装 - 避免用
img.show()验证——它依赖系统 GUI 环境,在服务器或 SSH 会话中必然失败
真正麻烦的从来不是“装上”,而是“所有格式读写都稳”。一旦发现某类图片打不开,别急着重装,先跑 python -c "from PIL import features; print(features.check('jpeg'))" 看具体缺哪个解码器。


















