Python项目中的setup.py和setup.cfg有什么区别?

94

想了解setup.py和setup.cfg之间的区别。这两者在OpenStack项目中都被广泛使用。


另请参阅 PEP-621 以了解 pyproject.toml - djvg
并且在setuptools文档中提供了一个有用的比较。 - djvg
3个回答

91

传统上,setup.py 用于构建 Python 包,即

python setup.py build

与任何旧的Python文件一样,setup.py可以包含大量代码。然而,在大多数情况下,它纯粹是声明性的,只是简单地列出软件包属性,例如:

from setuptools import setup

setup(
    name="foobar",
    version="0.1.0",
    author="John Doe",
    # ...
)

事实上,有些人认为在setup.py中放置大量逻辑并不好。 为了反映这一点,setup.cfg(根据设计是声明性的)已经变得更加流行用于打包:

[metadata]
name = foobar
version = 0.1.0
author = John Doe
# ...

这样做的好处在于打包软件(例如 setuptools)无需评估Python文件即可获取元数据,而只需解析配置文件。

您可以添加一个虚拟的setup.py文件,

from setuptools import setup

if __name__ == "__main__":
    setup()

或者完全采用PEP 517/518,并添加一个pyproject.toml文件。

[build-system]
requires = ["setuptools>=42", "wheel"]
build-backend = "setuptools.build_meta"

您可以使用pypa-buildpip install build)来构建您的项目。

python3 -m build --sdist --wheel .

自从2020年起,pyproject.toml也可以包含元数据了,所以你不再需要setup.cfg了。数据布局看起来有点像setup.cfg,但遵循标准化的TOML格式:

[build-system]
requires = ["setuptools>=61"]
build-backend = "setuptools.build_meta"

[project]
name = "foobar"
version = "0.1.0"
authors = [{name = "John Doe", email = "john@doe.com"}]
# [...]

一个设计目标是多个构建系统都将支持它(如setuptoolsflitPoetry等)。截至2022年,在安装该软件包时,setuptools仍会给出一个“实验性”警告,但这可能很快就会消失。


6
没有 setup.py 的包怎么办?例如在 meshplex 上,执行 pip install --editable . 会出现 "ERROR: File "setup.py" not found ... (A "pyproject.toml" file was found, but editable mode currently requires a setup.py based build.)" 错误。 - denis
@denis 你可能需要使用 -m pep517.build。(请参见 meshplex 中的 Makefile。) - Nico Schlömer
1
这个stackoverflow答案解释了如何创建一个带有C库扩展的包。它提供了一个在setup.py中添加代码的示例。是否可以使用setup.cfg来实现相同的效果?如果可以,能否给出一个示例? - chmike
2
对于C扩展,您仍需要保留setup.py。但是元数据可以放入setup.cfg中。请参考https://github.com/nschloe/pygalmesh/blob/main/setup.py作为示例。 - Nico Schlömer
4
我认为这是一个很好的答案,但老实说,它让我更加困惑,不知道我应该在新包中创建哪些文件。 - Per Johansson
“已经变得更受欢迎用于打包”相当可疑。我认为它更多是…你应该做的事情。 - Att Righ

15

setup.py 是实际构建软件的文件,其中包含构建指令。这些指令可能具有一些配置选项,例如针对单元测试,您可以指示是否应计算测试覆盖率或安装前缀等。

setup.cfg 是一个文件,可以用来指定这些选项,除了在调用 python setup.py <somecommand> 时读取命令行。

关于setup.cfg 的文档中指出:

  

通常情况下,事先无法写下构建分发所需的所有内容:您可能需要从用户或用户系统中获取一些信息才能继续。只要该信息相当简单 - 例如要搜索C头文件或库的目录列表 - 那么提供一个配置文件setup.cfg,让用户进行编辑是一种廉价且简便的方法。配置文件还可以让您为任何命令选项提供默认值,安装程序可以通过命令行或编辑配置文件来覆盖这些默认值。


13

setup.py 是 Python 包的重要组成部分,其中包括有关应该成为包的文件的详细信息或信息。这包括安装和运行你的 Python 包所需的必需依赖项、入口点、许可证等。

另一方面,setup.cfg 更多地涉及任何插件的设置或您希望创建的发行类型的设置。bdist/sdist 和进一步分类为通用或核心-Python 轮。它还可用于配置 setup.py 的某些元数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接