创建 PyPI 友好的 README

README 文件可以帮助您的用户理解您的项目,并可用于在 PyPI 上设置您的项目描述。本指南将帮助您以 PyPI 友好的格式创建 README,并将您的 README 包含在您的包中,以便它出现在 PyPI 上。

创建 README 文件

Python 项目的 README 文件通常命名为 READMEREADME.txtREADME.rstREADME.md

为了使您的 README 在 PyPI 上正确显示,请选择 PyPI 支持的标记语言。PyPI 的 README 渲染器支持的格式有:

通常,您会将 README 文件保存在项目的根目录中,与 setup.py 文件在同一目录中。

将您的 README 包含在包的元数据中

要将您的 README 内容作为包描述包含进来,请设置项目的 DescriptionDescription-Content-Type 元数据,通常在项目的 setup.py 文件中。

例如,要在包的 setup.py 文件中设置这些值,请使用 setup()long_descriptionlong_description_content_type

long_description 的值设置为 README 文件本身的内容(而不是路径)。将 long_description_content_type 设置为您的 README 文件标记可接受的 Content-Type 风格的值,例如 text/plaintext/x-rst(对于 reStructuredText)或 text/markdown

注意

如果您正在使用 GitHub Flavored Markdown 编写项目描述,请确保升级以下工具:

python3 -m pip install --user --upgrade setuptools wheel twine
py -m pip install --user --upgrade setuptools wheel twine

相关工具的最低要求版本是:

  • setuptools >= 38.6.0

  • wheel >= 0.31.0

  • twine >= 1.11.0

建议您使用 twine 上传项目的分发包。

twine upload dist/*

例如,请参阅此 setup.py 文件,它将 README.md 的内容读取为 long_description,并将标记标识为 GitHub Flavored Markdown:

from setuptools import setup

# read the contents of your README file
from pathlib import Path
this_directory = Path(__file__).parent
long_description = (this_directory / "README.md").read_text()

setup(
    name='an_example_package',
    # other arguments omitted
    long_description=long_description,
    long_description_content_type='text/markdown'
)

验证 reStructuredText 标记

如果您的 README 是用 reStructuredText 编写的,任何无效的标记都将阻止其渲染,导致 PyPI 只显示 README 的原始源。

请注意,在 docstring 中使用的 Sphinx 扩展,例如指令角色(例如,“:py:func:`getattr`”或“:ref:`my-reference-label`”),此处不允许使用,并将导致诸如“Error: Unknown interpreted text role "py:func".”的错误消息。

您可以在上传前按如下方式检查 README 中的标记错误:

  1. 安装最新版本的 twine;要求版本 1.12.0 或更高。

    python3 -m pip install --upgrade twine
    
    py -m pip install --upgrade twine
    
  2. 按照打包您的项目中所述,构建项目的 sdist 和 wheel。

  3. 对 sdist 和 wheel 运行 twine check

    twine check dist/*
    

    此命令将报告渲染 README 时的任何问题。如果您的标记渲染正常,该命令将输出 Checking distribution FILENAME: Passed