setuptools 应该在 setup.cfg 文件的 setup_requires 条目中吗?

Mag*_*ero 11 python setuptools python-wheel

importlib_resourcesPython < 3.7 的importlib.resources标准库模块的backport在 setup.cfg 文件中有以下部分:

[options]
python_requires = >=2.7,!=3.0,!=3.1,!=3.2,!=3.3
setup_requires =
    setuptools
    wheel
install_requires =
    pathlib2; python_version < '3'
    typing; python_version < '3.5'
packages = find:
Run Code Online (Sandbox Code Playgroud)

为什么setup_requires包括setuptools?这似乎没有意义,因为:

  • setup.py 文件的第一行导入setuptools,因此当setup调用该函数并读取指示安装setuptools它的 setup.cfg 文件时,安装已经为时已晚setuptools

    from setuptools import setup
    setup()
    
    Run Code Online (Sandbox Code Playgroud)
  • setuptools 已经安装在任何新的 Python 安装上(嗯,仅在 Windows 10 和 MacOS 10.15 和 Python 3.8.0 上测试过):

    $ python -V
    Python 3.8.0
    $ pip list
    Package    Version
    ---------- -------
    pip        19.2.3
    setuptools 41.2.0
    WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.
    You should consider upgrading via the 'python -m pip install --upgrade pip' command.
    
    Run Code Online (Sandbox Code Playgroud)

Mag*_*ero 10

不,setuptools不应包含在 中setup_requires,根据PEP 518(粗体强调我的):

setuptools 试图通过setup_requiressetup()函数的参数来解决这个问题 [3]。该解决方案存在许多问题,例如:

  • 没有工具(除了 setuptools 本身)可以在不执行 的情况下访问此信息setup.py,但setup.py如果没有安装这些项目则无法执行。
  • 虽然 setuptools 本身会安装其中列出的任何内容,但直到函数执行期间才会安装它们setup(),这意味着实际使用此处添加的任何内容的唯一方法是通过日益复杂的机制来延迟这些模块的导入和使用直到稍后执行该setup()函数。
  • 这不能包括setuptools其本身,也不能包括 的替代品setuptools,这意味着诸如此类的项目numpy.distutils很大程度上无法利用它,并且项目无法利用较新的 setuptools 功能,直到其用户自然地将 setuptools 版本升级到较新的版本。
  • setup_requires每当您执行 时,都会隐式安装中列出的项目setup.py,但执行 的常见方法之一setup.py是通过另一个工具,例如pip,它已经在管理依赖项。这意味着像这样的命令pip install spam最终可能会同时让 pip 和 setuptools 下载和安装软件包,最终用户需要配置这两个工具(并且setuptools无法控制调用)来更改设置,例如从哪个存储库安装。这还意味着用户需要了解这两种工具的发现规则,因为一种工具可能支持不同的包格式或以不同的方式确定最新版本。


Jas*_*mbs 5

接受的答案大部分是正确的,但 PEP 518 说的是。

setup_requires机制】不能包含setuptools自身...

它在技术上是不正确的,正如importlib_resources演示的那样,它实际上可以包含setuptools. 问题是包含setuptoolsinsetup_requires主要用作文档。它声明这setuptools是一个构建要求(运行 setup.py 所必需的),但如果它尚未满足,它将无法满足该要求。

但是,setuptoolsin的存在在setup_requires技术上是正确的,并且确实用于声明需求并要求安装工具验证该需求实际上已安装(以及其他安装时间要求)。

然而,它只是一个遗留工件,并没有提供那么多价值,正如在问答中可以看到的那样,它确实会导致混淆。推荐的、正确的方法是使用 PEP 517 和 518 声明和构建器,但生态系统的那部分尚未成熟,因此 setuptools 的痕迹将保留。尽量不要让他们打扰你。