我正在创建一个包含'typing;python_version<"3.5"'
的包,它的install_requires
.显然,这种依赖规范仅在最新版本的setuptools
中实现。如果用户计算机上的setuptools
较旧,他们将获得:
"install_requires"必须是包含有效项目/版本要求说明符的字符串或字符串列表;预期的版本规范 typeping;python_version<"3.5" at ;p ython_version<"3.5">
简单的解决方案是告诉用户在pip install my-package
之前pip install 'setuptools>=36.2.1'
。(请注意,36.2.1
只是一个我知道有效的版本,不一定是绝对的最低要求(
但是有没有办法在setup.py
中指定此要求以使其自动完成?向install_requires
和setup_requires
添加setuptools>=36.2.1
不起作用。它说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 - 为Python项目指定最低构建系统要求,以解决这个确切的问题。
简而言之,这个公认的 PEP 建议将依赖项以 TOML 格式存储在名为 pyproject.toml
的文件中。对于大多数 Python 项目,此文件的内容将是:
[build-system]
# Minimum requirements for the build system to execute.
requires = ["setuptools", "wheel"] # PEP 508 specifications.
在这个特定问题的情况下,我们只需要用 "setuptools>=36.2.1"
替换"setuptools"
.
坏消息是pip
还不支持这一点。好消息是它已经实现,并且可能会随 pip 9.1 一起提供。