setup.py:在尝试安装之前需要最新版本的 setuptools

setup.py: require a recent version of setuptools before trying to install

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

'install_requires' must be a string or list of strings containing valid project/version requirement specifiers; Expected version spec in typing;python_version<"3.5" at ;python_version<"3.5"

简单的解决方案是告诉用户 pip install 'setuptools>=36.2.1'pip install my-package 之前。 (请注意,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 然后给出与上面相同的错误。

您无法一次性更新 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"']
)

我刚刚了解到 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 implemented and will probably be shipped with pip 9.1.