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

时间:2018-01-01 10:07:07

标签: python setuptools setup.py install-requires

我正在创建一个包含'typing;python_version<"3.5"' install_requires的软件包。显然,这种dependency specification仅在setuptools的最新版本中实现。如果用户计算机上的setuptools已过时,他们将获得:

  

&#39; install_requires&#39;必须是包含有效项目/版本要求说明符的字符串或字符串列表;预期的版本规格   打字; PYTHON_VERSION&LT;&#34; 3.5&#34; at; python_version&lt;&#34; 3.5&#34;

简单的解决方案是在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,然后给出相同的错误。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我刚刚了解了解决这个问题的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