我正在创建一个包含'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_requires
和setup_requires
不起作用。它说Installed /tmp/pip-si2fqg-build/.eggs/setuptools-38.2.5-py3.3.egg
,然后给出相同的错误。
答案 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 implemented和will probably be shipped with pip 9.1。