setup.cfg 文件包含 setup.py 脚本命令的默认选项。如果构建和分发包的过程更加复杂并且需要向 setup.py 命令中传入许多可选参数那么这个文件非常有用。你可以按项目将这些默认参数保存在代码中。这将使你的分发流程独立于项目之外也能够让包的构建方式与向用户和其他团队成员的分发方式变得透明。setup.cfg 文件的语法与内置 configparser 模块提供的语法相同因此它类似于常见的 Microsoft Windows INI 文件。下面是安装配置文件的示例提供了 global、sdist和 bdist_wheel 命令的默认值代码如下[global]quiet1[sdist]formatszip,tar[bdist_wheel]universal1这个配置示例可以确保源代码发行版总是以两种格式创建ZIP 和 TAR并且构建wheel 发行版将被创建为通用 wheel与 Python 版本无关。此外由于全局 quiet 开关每个命令的大部分输出都将被阻止。注意这只是为了便于说明默认阻止每个命令的输出可能并不是一个合理的选择。MANIFEST.in使用 sdist 命令构建发行版时distutils 将浏览包的目录查找需要包含在存档中的文件。distutils 将包含• py_modules、packages 和 scripts 选项隐含的所有 Python 源文件。• ext_modules 选项列出的所有 C 源文件。匹配 glob 模式 test/test*.py 的文件包括README、README.txt、setup.py和 setup.cfg。此外如果你的包是由 subversion 或 CVS 管理那么 sdist 将浏览诸如.svn 之类的文件夹查找需要包含的文件。利用扩展也可以与其他版本控制系统集成。sdist 将构建一个 MANIFEST 文件列出所有文件并将它们包含在存档中。假设你不使用这些版本控制系统并且需要包含更多的文件。现在在与 setup.py相同的目录中你可以为 MANIFEST 文件定义一个名为 MANIFEST.in 的模板在其中你可以指定 sdist 要包含哪些文件。这个模板的每一行都定义一条包含或排除规则例如include HISTORY.txtinclude README.txtinclude CHANGES.txtinclude CONTRIBUTORS.txtinclude LICENSErecursive-include *.txt *.pyMANIFEST.in 命令的完整列表可以在 distutils 官方文档中找到。最重要的元数据除了被分发包的名称和版本之外setup 可以接受的最重要的参数包括。• description包含描述包的几句话。• long_description包含完整说明可以使用 reStructuredText 格式。• keywords定义包的关键字列表。• author作者的姓名或组织。• author_email联系人电子邮件地址。• url项目的 URL。• license许可证GPL、LGPL 等。• packages包中所有名称的列表setuptools 提供了一个名为 find_packages的小函数来计算它。• namespace_packages命令空间包的列表。trove 分类器PyPI 和 distutils 为应用程序分类提供了一种解决方案就是使用一套被称为 trove分类器trove classifiers的分类器。所有分类器都形成一个树状结构。每个分类器都是字符串形式其中用::字符串分隔每个命名空间。分类器列表在包定义中是作为 setup()函数的 classifiers 参数。下面是 PyPI 上某个项目的分类器列表示例这里是 solrq 项目from setuptools import setupsetup(name“solrq”,(…)classifiers[‘Development Status :: 4 - Beta’,‘Intended Audience :: Developers’,‘License :: OSI Approved :: BSD License’,‘Operating System :: OS Independent’,‘Programming Language :: Python’,‘Programming Language :: Python :: 2’,‘Programming Language :: Python :: 2.6’,‘Programming Language :: Python :: 2.7’,‘Programming Language :: Python :: 3’,‘Programming Language :: Python :: 3.2’,‘Programming Language :: Python :: 3.3’,‘Programming Language :: Python :: 3.4’,‘Programming Language :: Python :: Implementation :: PyPy’,‘Topic :: Internet :: WWW/HTTP :: Indexing/Search’,],)它们在包定义中是完全可选的但可以对 setup()接口中可用的基本元数据提供有用的扩展。此外trove 分类器还可以提供以下信息支持的 Python 版本或系统、项目的开发阶段或发布代码所使用的许可证。许多 PyPI 用户按类别对可用的包进行搜索和浏览因此正确的分类可以让 Python 包找到目标客户。trove 分类器在整个打包生态系统中发挥重要作用不应该被忽略。没有一个组织来验证包的分类所以你有责任为你的包提供正确的分类器并且不要为整个包索引带来混乱。在编写本书时PyPI 上共有 608 个可用的分类器分为以下 9 类。• 开发状态Development Status。• 环境Environment。• 框架Framework。• 目标受众Intended Audience。• 许可证License。• 自然语言Natural Language。• 操作系统Operating System。• 编程语言Programming Language。• 话题Topic。由于不时会添加新的分类器所以在你阅读本书时这些数字可能会有所不同。当前可用的 trove 分类器的完整列表可以用 setup.py register --list-classifiers 命令来查看。