【问题标题】:setup.py: require a recent version of setuptools before trying to installsetup.py:在尝试安装之前需要最新版本的 setuptools
【发布时间】:2018-06-11 10:30:07
【问题描述】:

我正在创建一个包含'typing;python_version<"3.5"' 的包,它是install_requires。显然,这种dependency specification 仅在setuptools 的最新版本中实现。如果用户机器上的setuptools 是旧的,他们会得到:

'install_requires' 必须是包含有效项目/版本要求说明符的字符串或字符串列表;预期版本规范 键入;python_version

简单的解决方案是在pip install my-package 之前告诉用户pip install 'setuptools>=36.2.1'。 (请注意,36.2.1 只是我知道有效的版本,不一定是绝对最低要求)

但是有没有办法在setup.py 中指定这个要求,以便它自动完成?将setuptools>=36.2.1 添加到install_requiressetup_requires 不起作用。它说Installed /tmp/pip-si2fqg-build/.eggs/setuptools-38.2.5-py3.3.egg,然后给出与上面相同的错误。

【问题讨论】:

    标签: python setuptools setup.py install-requires


    【解决方案1】:

    我刚刚了解到PEP 518 -- Specifying Minimum Build System Requirements for Python Projects 可以解决这个确切的问题。

    简而言之,这个被接受的 PEP 建议将依赖项以 TOML 格式存储在一个名为 pyproject.toml 的文件中。对于大多数 Python 项目,此文件的内容为:

    [build-system]
    # Minimum requirements for the build system to execute.
    requires = ["setuptools", "wheel"]  # PEP 508 specifications.
    

    在这个具体问题的情况下,我们只需要将"setuptools" 替换为"setuptools>=36.2.1"

    坏消息是pip 还不支持这个。好消息是it is implementedwill probably be shipped with pip 9.1

    【讨论】:

      【解决方案2】:

      您无法一次性更新setuptools 并在设置脚本中使用其代码。我看到了两种可能的解决方案:如果您想支持旧版本的 setuptools,则不能使用 env 标记。使用sys.version_info 自行实施检查:

      import sys
      from setuptools import setup
      
      
      setup(
          name='spam',
          version='0.1',
          packages=[],
          install_requires=['typing'] if sys.version_info < (3, 5) else []
      )
      

      如果您不想支持旧版本的setuptools,请检查其版本并提前中止,并通知用户:

      import sys
      from distutils.version import StrictVersion
      from setuptools import setup, __version__
      
      
      if StrictVersion(__version__) < StrictVersion('20.2'):
          print('your setuptools version does not support PEP 508. Upgrade setuptools and repeat the installation.')
          sys.exit(1)
      
      
      setup(
          name='spam',
          version='0.1',
          packages=[],
          install_requires=['typing;python_version<"3.5"']
      )
      

      【讨论】:

      • 第一种方法的问题是,如果有人使用 Python 3.5 或更高版本创建了一个轮子文件,那么创建的轮子将不包含 typing 要求,因此该轮子将无法正确安装较旧的 python 版本。
      • 通常是项目维护者/开发者创建轮子并将它们上传到 PyPI。他负责构建在宣传支持的每个平台/语言实现上运行的轮子(可以想象像mypkg-0.1-cp35.cp36-abi3-any.whl 这样的东西)。如果有人提取了您的源代码并构建了一个无法运行的轮子,您不能对此负责;-)
      猜你喜欢
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 2021-09-14
      • 2023-01-27
      • 2021-04-29
      • 1970-01-01
      相关资源
      最近更新 更多