我们可以在 setup.py
文件中放入什么来防止 pip 在使用不受支持的 Python 版本时收集和尝试安装包?
例如magicstack
是使用 trove 分类器列出的项目:
Programming Language :: Python :: 3 :: Only
因此,如果 pip --version
绑定(bind)到 python 2.7,我预计会出现以下行为:
$ pip install magicstack
Collecting magicstack
Could not find a version that satisfies the requirement magicstack (from versions: )
No matching distribution found for magicstack
但实际行为是 pip 收集一个版本,下载它,尝试安装它,但失败了。还有其他仅限 Python3 的版本,curio
例如,它实际上安装得很好——因为 setup.py
没有使用任何特定于 Python 3 的东西——只是在导入时失败,当使用了一些仅适用于 Python 3 的语法时。而且我确定有些软件包安装正常,导入正常,并且可能只在运行时失败!
以 pip 将遵守的方式指定支持的 Python 版本的正确方法是什么?我找到了一个解决方法,涉及仅上传一个 wheel 文件,并拒绝上传 .tar .gz 发行版,但我很想知道正确的修复方法。
编辑:如果 Python/os/architecture 不匹配,pip 如何知道不下载 wheel 发行版?它只使用 .whl filename convention 吗?还是有比幕后发生的事情更复杂的事情?我们能否以某种方式将元数据提供给源分发,让 pip 正确处理 .tar.gz 上传?
最佳答案
有一个正确的方法可以做到这一 pip ,但不幸的是 pip 仅在 9.0.0 版本(2016-11-02 发布)中才开始支持它,因此使用旧版本 pip 的用户将继续下载软件包,无论如何它们适用于哪个 Python 版本。
在您的setup.py
文件中,向setup()
传递一个python_requires
参数,该参数将您的包支持的Python 版本列为PEP 440。 version specifier .例如,如果您的包仅适用于 Python 3+,请编写:
setup(
...
python_requires='>=3',
...
)
如果您的软件包适用于 Python 3.3 及更高版本,但您还不愿意 promise 支持 Python 4,请写:
setup(
...
python_requires='~=3.3',
...
)
如果您的包适用于 Python 2.6、2.7 和所有从 3.3 开始的 Python 3 版本,请写:
setup(
...
python_requires='>=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4',
...
)
等等。
完成后,您需要将 setuptools 版本至少升级到 24.2.0,以便处理 python_requires
参数;早期版本只会忽略它并发出警告。之后构建的所有项目的 sdists 和 wheels 将包含相关的元数据,这些元数据告诉 PyPI 告诉 pip 它们适用的 Python 版本。
关于python - 防止在旧的 Python 版本上安装包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42238484/