以编程方式检查Wheel包是否与Python安装兼容

5

在尝试安装之前,是否可以通过程序检查一个wheel(whl)与所选Python安装的兼容性?

我正在制作一个自动化的包安装程序(为了让我的Python项目工作所需的包),我只需要尝试安装兼容的包,这样如果有错误,我就知道它们仅来自于兼容的模块,我需要看看发生了什么(而不是来自于不兼容的包的错误,这些我不关心)。例如:我会有Python 3.5和3.7的wheels,在3.5安装中,不能尝试安装3.7 wheels。

我已经尝试过pkginfo(https://pypi.org/project/pkginfo/),但在wheel.supported_platforms上,它返回一个空数组,我无法对其进行任何操作(带有平台部分的"any"或"win32"名称的wheel返回一个空数组,所以我无法使用它,似乎是如此)。

还尝试了python -m pip debug --verbose 的输出,但下面出现了以下内容:

WARNING: This command is only meant for debugging. Do not use this with automation for parsing and getting these details, since the output and options of this command may change without no
tice.

这使得命令无法使用,即使在它下面打印出“兼容标签”,我也可以从中大致确定一个轮是否受支持。以下是Python数组中这些“兼容标签”的示例:
['cp39-cp39-win_amd64', 'cp39-abi3-win_amd64', 'cp39-none-win_amd64', 'cp38-abi3-win_amd64', 'cp37-abi3-win_amd64', 'cp36-abi3-win_amd64', 'cp35-abi3-win_amd64', 'cp34-abi3-win_amd64', 'cp
33-abi3-win_amd64', 'cp32-abi3-win_amd64', 'py39-none-win_amd64', 'py3-none-win_amd64', 'py38-none-win_amd64', 'py37-none-win_amd64', 'py36-none-win_amd64', 'py35-none-win_amd64', 'py34-no
ne-win_amd64', 'py33-none-win_amd64', 'py32-none-win_amd64', 'py31-none-win_amd64', 'py30-none-win_amd64', 'cp39-none-any', 'py39-none-any', 'py3-none-any', 'py38-none-any', 'py37-none-any
', 'py36-none-any', 'py35-none-any', 'py34-none-any', 'py33-none-any', 'py32-none-any', 'py31-none-any', 'py30-none-any']

例如,如果有文件名为“pyHook-1.5.1-cp36-cp36m-win32.whl”的文件,我可以检查该名称并查看它是否兼容(除了上述警告...)。
还有其他的想法吗?
非常感谢任何帮助!
编辑:我可以手动提取名称中的内容,并将我在文档中看到的一些可能性硬编码,例如“win32”和“win_amd64”(就像我以前做的那样),但是我需要确切了解名称部分可能具有的所有可能性(我在文档中看到一个很酷的表达式:“例如”-这意味着还有更多没有提到的事物),并且需要大量的工作才能完成。我希望已经有人完成了这样的工作(甚至Python本身也可能在其内部包中有某种方式)。

Wheel是否使用Travis CI管道?您能否从其构建中拉取数据并查看正在测试哪些Python版本? - Jeff Gruenbaum
@JeffGruenbaum你好。感谢您的回复。您能举几个例子来说明您所说的吗?那超出了我对Python的了解哈哈。 - Edw590
1
Travis CI是一种测试工具,可以配置为在对存储库进行更改时运行特定Python环境的测试。我正在查看wheel gituhub存储库,它似乎没有使用Travis CI。查看他们的github工作流程,您可以在此处查看正在测试哪些Python版本。您可能可以使用此功能并检查每个发布中的文件内容。设置可能需要一些工作,因此不确定它是否是最佳解决方案。 - Jeff Gruenbaum
1个回答

6
你可以使用打包来完成这个操作。
pip install packaging

一个获取类似于从pip获取标签的示例代码如下:

from packaging.tags import sys_tags

tags = sys_tags()

print([str(tag) for tag in tags])
# ['cp39-cp39-manylinux_2_33_x86_64', 'cp39-cp39-manylinux_2_32_x86_64', 'cp39-cp39-manylinux_2_31_x86_64', ..... , 'py31-none-any', 'py30-none-any']

当然,你可以通过编程使用上述变量 tags 做更多的事情:
>>> tags = sys_tags()
>>> for tag in list(tags)[:3]:
...     print(tag.interpreter, tag.abi, tag.platform)
... 
cp39 cp39 manylinux_2_33_x86_64
cp39 cp39 manylinux_2_32_x86_64
cp39 cp39 manylinux_2_31_x86_64

如需更深入的文档,请查看:https://packaging.pypa.io/en/latest/tags.html#packaging.tags.sys_tags


这不是通用的方法,因为它需要一个仅支持有限Python版本的包,但我认为它对我有效。而且,这仍然比手动检查命令输出的方式更好。谢谢!答案已被接受! - Edw590
虽然,如果有人(或您)找到了一种不需要名称的检查方法,请在此处发布代码!有些包的名称中带有“py2.py3”,我认为这意味着任何Python2/3版本,或者其他什么。无论如何,在这些情况下我无法正确检查,因为某些带有该名称的包不支持所有Python版本。只有一些。除非这意味着支持多个版本。但我不能这样检查。这方面的解决方案很有趣(也会让我困惑于接受哪个答案xd)。 - Edw590
1
我认为如果有人愿意付出一些努力,应该可以制作出更通用的实现。所有的代码似乎都在这里:https://github.com/pypa/packaging/blob/main/packaging/tags.py,也许有人可以将其翻译成C/C++?但是除非它也得到维护,否则它可能长期来说并不那么有用。 - chaitan94

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