python - 防止在旧的 Python 版本上安装包

标签 python pip setuptools pypi python-packaging

我们可以在 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 440version 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/

相关文章:

python-3.x - pip 搜索和 pip 安装出现错误

python - 在 setuptools 中使用 console_scripts 时出现 ImportError

python - 在新鲜环境中构建 cython 扩展 : cannot find/lib/libpthread. so.0

python - pip 不会安装 channels_redis

python - 更改 setup.py 中的输出目录

python - 从字符串中删除元音后重新分配给现有变量?

python - `x[False]` 在 numpy 中做什么?

python - 将一个系列分配给 Pandas DataFrame 的多行

python - 我可以返回一个操作作为具有 if...else 条件的 lambda 函数的输出吗?

python - 为什么我的 Python 脚本文件夹中有多个 pip 版本?