防止将软件包安装在旧的Python版本上

在使用不支持的Python版本时,我们可以在setup.py文件中放入什么来防止pip收集并尝试安装软件包?

例如magicstack是一个与magicstack分类器一起列出的项目:

Programming Language :: Python :: 3 :: Only

所以我期望下面的行为,如果pip --version绑定到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语法时导入时才会失败。 而且我确定有安装OK的软件包,导入OK,并且可能只在运行时失败!

以pip将尊重的方式指定您支持的Python版本的正确方法是什么? 我找到了一种解决方法,只涉及上传轮盘文件,并拒绝上传.tar.gz发行版,但我希望知道正确的修复方法。


编辑:如果Python / os / architecture不匹配,pip如何知道不要下载wheel分布? 它只是使用.whl文件名约定还是比幕后发生的更复杂一些? 我们可以以某种方式将元数据提供给源代码发行版,以使pip可以通过.tar.gz上传来做正确的事情吗?


有一种正确的方法可以做到这一点,但不幸的是,pip只是在9.0.0版本(2016-11-02发布)中开始支持它,所以使用较旧版本的pip的用户将继续无论使用何种Python都可以下载软件包他们的版本。

在您的setup.py文件中,传递setup()一个python_requires参数,该参数将您的软件包支持的Python版本列为PEP 440版本说明符。 例如,如果您的软件包仅适用于Python 3+,请编写:

setup(
    ...
    python_requires='>=3',
    ...
)

如果您的软件包适用于Python 3.3或更高版本,但您不愿意承诺支持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版本。


pypi上的magicstack发行被打破。 它失败了,因为源代码发行版不包含magicstack包,即使源代码发行版的setup.py说它应该。

只要pypi包含一个源代码发行版(例如.tar.gz.zip ),pip将下载它,如果它找不到与您的python / os / architecture版本匹配的二进制发行版(例如.egg.whl ) 。

你的选择只是将二进制发行版上传到pypi(最好是wheels ),但我甚至不知道是否允许使用二进制pypi包。 另一种选择是检查setup.pysys.version是否兼容版本,否则会引发异常。

链接地址: http://www.djcxy.com/p/95065.html

上一篇: Prevent package from being installed on old Python versions

下一篇: opencv imshow with waitKey too slow on Mac OS X 10.10.2 (using c++)