【问题标题】:Should setuptools be in the setup_requires entry of setup.cfg files?setuptools 是否应该在 setup.cfg 文件的 setup_requires 条目中?
【发布时间】:2020-02-19 14:44:36
【问题描述】:

importlib.resources 标准库模块的 Python importlib_resources 反向端口在 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:

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

  • setup.py 文件的第一行导入setuptools,所以当调用setup 函数并读取指示安装setuptools 的setup.cfg 文件时,安装@ 已经太迟了987654332@:

    from setuptools import setup
    setup()
    
  • 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.
    

【问题讨论】:

  • Python 也包含在每个全新的 Python 安装中,但它就在那里......
  • @MadPhysicist python_requires 有不同的语义:它不是为了安装 Python,而是为了防止 pip 为错误的 Python 版本安装发行版(参见 packaging.python.org/guides/…)。跨度>
  • 这根本没有任何意义。 setup_requiresinstall_requires 都不是标准关键字,不会被 distutils 识别;它们仅对 setuptools 有意义。一个简单的测试:python -c "from distutils.core import setup; setup(install_requires=['foo'])" --version 会吐出UserWarning: Unknown distribution option: 'install_requires'。这意味着如果setuptools没有安装,setup_requires不会有任何作用;因此在依赖项中列出它是没有用的。
  • setuptools 默认情况下未安装在 Python 上。它可能安装在某些发行版中,例如您在 Windows 上找到的,但在一般情况下,它不是,并且打包社区正在努力使 setuptools 完全可选。

标签: python setuptools python-wheel


【解决方案1】:

为什么 setup_requires 包含 setuptools?这似乎没有意义

完全没有意义。另一方面,它不会妨碍任何事情,为什么不呢?

【讨论】:

  • 感谢您的反馈。但是importlib_resources 维护人员是核心 Python 开发人员,因此他们不太可能意外地这样做。也许我只是不明白setup_requires 是如何工作的。我在某处读到setup_requirespip 不兼容。这是真的吗?
  • 不,不是真的。见setuptools.readthedocs.io/en/latest/…
  • 我不相信这是真的。实际发生的情况是 pip 正在慢慢走向 构建系统不可知论。有关一些信息,请参阅PEP 517。基本上,pip 会将所有构建操作委托给 setuptoolsflitpoetry 或任何其他替代方法。 pip 和构建系统之间的接口将是pyproject.toml 文件,请参阅PEP 518
  • @sinoroc 是的,由于 PEP 517-518 将 pipsetuptools 分离,您现在必须在 pyproject.toml 文件中指定构建工具。顺便说一句,importlib_resources 模块就是这样做的。但是该模块还在 setup.cfg 文件中指定了setuptools,这似乎没有意义,因为那时为时已晚。
  • 是的,我想我们都同意,这可能是一个错误,因为在设置要求中包含 setuptools 没有多大意义。
【解决方案2】:

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

Setuptools 尝试使用 setup_requires 参数来解决这个问题 setup() 函数 [3]。该解决方案存在许多问题,例如:

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

【讨论】:

    【解决方案3】:

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

    [setup_requires 机制] 不能包含setuptools 本身...

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

    但是,setup_requires 中的 setuptools 的存在在技术上是正确的,并且确实用于声明需求并要求 setuptools 验证该需求是否确实已安装(以及其他设置时要求)。

    然而,它只是一个遗留工件,并没有提供太多价值,而且从问题和答案中可以看出,它确实会导致混淆。推荐的、正确的方法是使用 PEP 517 和 518 声明和构建器,但是生态系统的那部分还没有成熟,所以 setuptools 的痕迹会保留下来。尽量不要让他们打扰你。

    【讨论】:

      猜你喜欢
      • 2017-10-05
      • 1970-01-01
      • 2015-11-30
      • 2017-12-06
      • 2016-11-20
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      相关资源
      最近更新 更多