这是一个在 Python 包管理和分发领域非常基础且重要的命令,尤其是在使用 setuptools 库时。

egg_info 是什么?
egg_info 是一个 setuptools 命令,它的核心作用是为你的 Python 项目生成元数据信息文件。
这些元数据文件描述了你的包是什么、它依赖什么、版本号是多少、作者是谁等等,它们通常被打包成一个名为 .egg-info 的目录。
当你运行 python setup.py egg_info 时,setuptools 会读取你项目根目录下的 setup.py 文件,并根据其中的信息,生成一组标准化的文件。
生成的 .egg-info 目录里有什么?
在一个典型的 Python 项目中,运行 python setup.py egg-info 后,你会看到一个类似 your_package_name.egg-info 的目录,这个目录通常包含以下关键文件:

PKG-INFO: 这是最重要的文件之一,它是一个 RFC822 格式的文本文件,包含了包的所有核心元数据,如名称、版本、作者、邮箱、许可证、依赖项等,很多工具(如 PyPI、pip)都会直接解析这个文件。SOURCES.txt: 列出了构成这个包的所有源代码文件,这对于确保所有必要的文件都被包含在最终的分发包中至关重要。top_level.txt: 列出了这个包的顶层模块或包名,当你import你的包时,这个文件告诉 Python 解释器应该从哪里开始寻找。dependency_links.txt: (可选)如果你的依赖项需要从非标准的 PyPI 源(比如你自己的私有仓库)下载,这个文件会列出那些链接。requires.txt: (可选)列出了这个包运行时所需要的依赖项,注意,这通常与setup.py中install_requires参数的作用类似,但PKG-INFO中的Requires-Dist字段是更标准的做法。
示例结构:
假设你有一个名为 my_calculator 的项目,运行命令后,你会得到:
my_calculator/
├── my_calculator/
│ └── __init__.py
├── setup.py
└── my_calculator.egg-info/ <-- 这就是 egg_info 生成的目录
├── PKG-INFO
├── SOURCES.txt
├── top_level.txt
└── dependency_links.txt
为什么需要 egg_info?(它的用途)
egg-info 生成的文件是整个 Python 包分发和安装流程的基石。
-
为后续打包步骤做准备:
- 当你运行
python setup.py sdist(创建源码分发包) 或python setup.py bdist_wheel(创建 wheel 二进制分发包) 时,这些命令会首先依赖egg_info生成的元数据。PKG-INFO会被用来填充sdist或wheel包头信息,SOURCES.txt会确保所有源文件都被正确打包。
- 当你运行
-
让本地安装成为可能:
- 在你使用
pip install .或python setup.py install安装本地开发中的包时,pip和setup.py会读取.egg-info目录来获取包的元数据,并将其注册到 Python 的环境中,这使得你可以在其他脚本中import你的本地包,而无需先将其上传到 PyPI。
- 在你使用
-
解决依赖关系:
PKG-INFO文件中的依赖信息 (Requires-Dist) 会被pip等工具用来在安装你的包时,自动下载和安装其所需的所有依赖包。
-
开发与调试:
- 开发者可以通过检查生成的
.egg-info目录来确认setup.py中的配置是否正确。top_level.txt是否正确地列出了你的模块名,SOURCES.txt是否包含了所有新添加的文件。
- 开发者可以通过检查生成的
如何使用它?(实践步骤)
假设你有一个简单的项目结构:
my_project/
├── my_project/
│ ├── __init__.py
│ └── utils.py
└── setup.py
第1步:编写 setup.py
setup.py 是 egg_info 命令的输入源,一个基础的 setup.py 文件如下:
# my_project/setup.py
from setuptools import setup, find_packages
setup(
name="my_project",
version="0.1.0",
author="Your Name",
author_email="your.email@example.com",
description="A simple example project",
packages=find_packages(), # 自动发现 my_project 目录
install_requires=[ # 列出依赖
"requests >= 2.20.0",
],
python_requires=">=3.6", # 指定 Python 版本要求
)
第2步:在项目根目录运行命令
打开终端,进入 my_project 目录,然后执行:
cd my_project python setup.py egg_info
第3步:检查结果
执行成功后,你会看到多了一个 my_project.egg-info 目录,你可以查看里面的内容:
# 查看 top_level.txt,确认你的顶层模块 cat my_project.egg-info/top_level.txt # 输出: my_project # 查看 PKG-INFO,确认元数据 head -n 10 my_project.egg-info/PKG-INFO # 输出类似: Metadata-Version: 2.1 Name: my_project Version: 0.1.0 Summary: A simple example project Home-page: Author: Your Name Author-email: your.email@example.com License: ...
现代替代品:pyproject.toml 与 build
在现代 Python 开发中,setup.py 正在逐渐被 pyproject.toml 文件取代。pyproject.toml 是 PEP 518/621 标准的一部分,它提供了更清晰、更标准化的项目配置方式。
使用 pyproject.toml 时,egg_info 还有效吗?
是的,它仍然有效,但通常不再需要手动调用。
现代的工具链(如 build)会自动处理这一切。
新的工作流程:
-
创建
pyproject.toml:# my_project/pyproject.toml [build-system] requires = ["setuptools>=61.0", "wheel"] build-backend = "setuptools.build_meta" [project] name = "my_project" version = "0.1.0" authors = [ { name = "Your Name", email = "your.email@example.com" }, ] description = "A simple example project" readme = "README.md" requires-python = ">=3.6" dependencies = [ "requests >= 2.20.0", ] [project.urls] Homepage = "https://github.com/yourusername/my_project" -
使用
build命令: 安装build工具:pip install build在项目根目录运行:python -m build
python -m build 会做什么?
这个命令会:
- 读取
pyproject.toml。 - 自动调用
setuptools在后台执行egg_info等步骤来生成元数据。 - 根据
pyproject.toml的配置,创建sdist(源码包) 和wheel(二进制包)。
在这个过程中,.egg-info 目录仍然会被临时创建,但不会像以前那样被保留在项目根目录里。
| 特性 | python setup.py egg_info |
pyproject.toml + python -m build |
|---|---|---|
| 核心作用 | 显式生成包的元数据目录 .egg-info。 |
隐式处理元数据,是现代打包流程的一部分。 |
| 配置文件 | setup.py (Python 脚本) |
pyproject.toml (TOML 格式,声明式) |
| 主要用途 | 手动生成元数据用于调试。 为旧版打包命令 ( sdist, bdist) 提供输入。 |
作为项目的唯一配置标准。 使用 python -m build 进行标准化打包。 |
是否保留 .egg-info |
是,会永久保留在项目目录中。 | 否,通常作为临时文件被创建和删除。 |
| 推荐度 | 已过时,对于新项目不推荐。 | 现代标准,所有新项目都应采用此方式。 |
- 如果你在维护一个旧项目,你很可能会遇到
python setup.py egg_info,理解它的作用(生成.egg-info元数据目录)和它包含的文件 (PKG-INFO,SOURCES.txt等) 对于调试和打包问题非常有帮助。 - 如果你在开始一个新项目,请直接使用
pyproject.toml和python -m build,虽然egg-info的概念在底层依然存在,但你不再需要手动与它交互,整个流程变得更加简洁和标准化。
