.whl是PEP 427定义的官方二进制分发标准,取代已弃用的.egg;其命名含包名、Python实现、ABI、平台五段标签,确保兼容性;pip 10.0+移除.egg安装因设计冲突与安全管控。

.whl 格式不是“更先进”——它是被明确设计来取代 .egg 的标准格式,且已从 2012 年 PEP 427 起成为 Python 官方推荐的二进制分发格式。所有主流工具(pip、setuptools、twine)默认生成和安装的都是 .whl,.egg 已事实弃用。
为什么 pip install 不再支持 .egg 直接安装?
pip 自 10.0 版本起彻底移除了对 .egg 文件的直接安装能力(错误信息:ERROR: *.egg is not a supported wheelhouse format 或类似提示)。这不是 bug,而是有意为之:
-
.egg是运行时可导入格式,设计上允许动态加载,但带来路径解析、依赖注入等不可控行为 -
pip的目标是纯声明式安装:解压 → 复制 → 记录元数据 → 完成,不执行任意代码 -
.egg的.egg-info目录结构与现代dist-info不兼容,无法满足 PEP 376 的包管理规范
whl 文件名里那串下划线是什么意思?
numpy-1.26.4-cp39-cp39-win_amd64.whl 这类名字不是随意拼的,而是由 PEP 427 定义的标准化命名规则,包含 5 段信息:
- 包名 + 版本(
numpy-1.26.4) - Python 实现与版本(
cp39= CPython 3.9) - ABI 标签(
cp39表示无需 ABI 兼容层;cp39d表示启用了调试模式) - 平台标签(
win_amd64、manylinux2014_x86_64、macosx_10_9_universal2) - 扩展名(
.whl)
这个结构让 pip 能在下载前精准过滤不兼容的构建,避免“装上了却不能用”的问题;而 .egg 文件名无此约束,全靠人工判断。
为什么把 .whl 改成 .zip 就能打开,但 .egg 不一定行?
.whl 本质就是 ZIP,且强制要求使用 UTF-8 路径名、不加密、无跨卷压缩 —— 所有解压工具都能无条件打开。而 .egg 虽也常是 ZIP,但:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 可能含非标准 ZIP 结构(如自解压头、附加签名块)
- 路径编码混乱(早期用 sys.getfilesystemencoding(),Windows 上常为 GBK)
- 部分
.egg实际是目录而非归档(尤其开发模式下python setup.py develop生成的)
这意味着你无法可靠地用 zipfile 模块读取所有 .egg,但读 .whl 总是安全的。
dist-info 和 egg-info 的区别不只是后缀不同
安装后,.whl 写入的是 package_name-1.2.3.dist-info/,.egg 写入的是 package_name-1.2.3-py3.9.egg-info/。关键差异在于:
-
dist-info必须包含INSTALLER(记录谁装的)、RECORD(文件哈希清单)、WHEEL(wheel 元数据)——这些是pip uninstall和pip check的依据 -
egg-info仅保证有PKG-INFO和requires.txt,无校验机制,卸载时只能删目录,容易残留 -
dist-info支持多版本共存(通过direct_url.json等),egg-info无此能力
如果你在 CI 中跑 pip list --outdated 或依赖 importlib.metadata 读取包信息,底层全靠 dist-info。用 .egg 的项目,这些 API 基本失效。
真正麻烦的不是“怎么选”,而是当旧项目还在用 easy_install 或手动解压 .egg 时,会误以为那是“合法安装方式”。现在连 setuptools 本身都只生成 .whl,.egg 只剩历史包袱价值。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










