杰瑞科技汇

Python egg info 模块如何创建与管理?

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

Python egg info 模块如何创建与管理?-图1
(图片来源网络,侵删)

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 的目录,这个目录通常包含以下关键文件:

Python egg info 模块如何创建与管理?-图2
(图片来源网络,侵删)
  • PKG-INFO: 这是最重要的文件之一,它是一个 RFC822 格式的文本文件,包含了包的所有核心元数据,如名称、版本、作者、邮箱、许可证、依赖项等,很多工具(如 PyPI、pip)都会直接解析这个文件。
  • SOURCES.txt: 列出了构成这个包的所有源代码文件,这对于确保所有必要的文件都被包含在最终的分发包中至关重要。
  • top_level.txt: 列出了这个包的顶层模块或包名,当你 import 你的包时,这个文件告诉 Python 解释器应该从哪里开始寻找。
  • dependency_links.txt: (可选)如果你的依赖项需要从非标准的 PyPI 源(比如你自己的私有仓库)下载,这个文件会列出那些链接。
  • requires.txt: (可选)列出了这个包运行时所需要的依赖项,注意,这通常与 setup.pyinstall_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 包分发和安装流程的基石。

  1. 为后续打包步骤做准备:

    • 当你运行 python setup.py sdist (创建源码分发包) 或 python setup.py bdist_wheel (创建 wheel 二进制分发包) 时,这些命令会首先依赖 egg_info 生成的元数据。PKG-INFO 会被用来填充 sdistwheel 包头信息,SOURCES.txt 会确保所有源文件都被正确打包。
  2. 让本地安装成为可能:

    • 在你使用 pip install .python setup.py install 安装本地开发中的包时,pipsetup.py 会读取 .egg-info 目录来获取包的元数据,并将其注册到 Python 的环境中,这使得你可以在其他脚本中 import 你的本地包,而无需先将其上传到 PyPI。
  3. 解决依赖关系:

    • PKG-INFO 文件中的依赖信息 (Requires-Dist) 会被 pip 等工具用来在安装你的包时,自动下载和安装其所需的所有依赖包。
  4. 开发与调试:

    • 开发者可以通过检查生成的 .egg-info 目录来确认 setup.py 中的配置是否正确。top_level.txt 是否正确地列出了你的模块名,SOURCES.txt 是否包含了所有新添加的文件。

如何使用它?(实践步骤)

假设你有一个简单的项目结构:

my_project/
├── my_project/
│   ├── __init__.py
│   └── utils.py
└── setup.py

第1步:编写 setup.py

setup.pyegg_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.tomlbuild

在现代 Python 开发中,setup.py 正在逐渐被 pyproject.toml 文件取代。pyproject.toml 是 PEP 518/621 标准的一部分,它提供了更清晰、更标准化的项目配置方式。

使用 pyproject.toml 时,egg_info 还有效吗?

是的,它仍然有效,但通常不再需要手动调用。

现代的工具链(如 build)会自动处理这一切。

新的工作流程:

  1. 创建 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"
  2. 使用 build 命令: 安装 build 工具:pip install build 在项目根目录运行:

    python -m build

python -m build 会做什么?

这个命令会:

  1. 读取 pyproject.toml
  2. 自动调用 setuptools 在后台执行 egg_info 等步骤来生成元数据。
  3. 根据 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.tomlpython -m build,虽然 egg-info 的概念在底层依然存在,但你不再需要手动与它交互,整个流程变得更加简洁和标准化。
分享:
扫描分享到社交APP
上一篇
下一篇