让Python的pip找出正确的软件包版本进行下载

3
我曾多次遇到这个问题。在工作中,我们在Windows上使用旧版本的Python(2.5),经常会出现如下情况:当我执行例如pip install zope.interface时,pip总是下载软件包的最新版本,而不管该软件包是否支持我的Python版本。因此,上述示例将下载4.0.1,尽管该PKG-INFO未列出Python 2.5作为支持的版本,因此我会得到一个安装错误。
  File "C:\Users\jamaam\build\zope.interface\setup.py", line 42
except DistutilsPlatformError as e:

我希望pip能够更加智能,并安装适用于我的python版本(在这个例子中为3.8.0)的最高版本的软件包,可能会提醒此软件包不是最新版本,而无需我手动搜索可安装版本的环境。是否有任何方法可以实现?
以下是PKG-INFO的部分内容,其中明显没有列出python 2.5。
381 Classifier: Operating System :: OS Independent
382 Classifier: Programming Language :: Python :: 2.6
383 Classifier: Programming Language :: Python :: 2.7
384 Classifier: Programming Language :: Python :: 3
385 Classifier: Programming Language :: Python :: 3.2
386 Classifier: Topic :: Software Development :: Libraries :: Python Modules
1个回答

1
不,没有元数据可用于进行此类调用,因此没有任何工具(包括pip)可以使用来确定哪个版本的软件包适用于您的Python版本。
您唯一的选择是在安装时使用版本固定:
pip install -I zope.interface==3.8.0

请注意这里的-I开关;由于您已经尝试安装了最新版本,您可能需要忽略任何已安装的版本以强制降级。
请注意,Trove Python版本分类器(Classifier: Programming Language :: Python :: *)不能被依赖于此任务;如果开发人员记得这样做,它们会被设置,但后来无法更新以指示与新Python版本的兼容性。它们应该被视为帮助在PyPI和其他软件包索引上细化搜索的一种方式,而不是安装程序使用的元数据。

我不同意你的观点,我已经在问题中添加了PKG-INFO片段,以展示支持的版本列表。 - Meitham
@Meitham:Trove分类器不可靠,仅适用于UI使用。首先:依赖分类器将排除未来的Python版本,而包在该版本上可能运行良好。 - Martijn Pieters
但是pip仍然会解析文件以查找“Requires”指令。如果Classifier不是标准的话,我应该建议添加一个带有较低版本和较高版本的Syntax指令。因此,在zope.interface中,它将是Syntax: 2.6 :: 3.2 - Meitham
但是如果3.4版本也兼容呢?你不能回头再更新软件包中的那个信息,因为你已经发布了它。此外,关键是现在没有这样的元数据。 - Martijn Pieters
没错,我会研究一下Debian如何处理依赖关系和版本。在此期间,谢谢你,我已经接受了你的答案。 - Meitham
Debian 可以发布现有版本的新包装(它们具有自己的包装版本 发布版本之上),因此他们可以稍后更新依赖项。但是,他们也控制整个应用程序(Linux 安装),而上游发布管理者则没有。这里有一个重大的用例差异。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接