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

Programmatically check if wheel is compatible with Python installation

是否可以在尝试安装之前以编程方式检查轮子 (whl) 是否与所选 Python 安装兼容?

我正在制作一个自动包安装程序(我的 Python 项目需要的包才能工作),我只需要尝试安装兼容的包,所以如果有错误,我知道它们只是从兼容的模块中,我应该看到发生了什么(而不是来自不兼容的 pkg 的错误,我不在乎)。示例:我有 Python 3.5 和 3.7 的轮子,在 3.5 安装中,无法尝试安装 3.7 轮子。

我试过 pkginfo (https://pypi.org/project/pkginfo/),但在 wheel.supported_platforms 上,它 returns 是一个空数组,我无法用它做任何事情(a在平台部分的名称中带有“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 本身在它的任何内部包中都有一些方法)。

您可以使用 packaging 执行此操作。

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