是否可以在尝试安装之前以编程方式检查wheel (whl)是否与所选择的Python安装兼容?
我正在制作一个自动化的包安装程序(我的Python项目需要的包),我只需要尝试安装兼容的pkgs,所以如果有错误,我知道它们只来自兼容的模块,我应该看看发生了什么(不是错误也来自不兼容的pkgs,我不在乎)。示例:我将在Python 3.5和3.7中安装轮子,而在3.5安装中,无法尝试安装3.7轮子。
我试过pkginfo
(https://pypi.org/project/pkginfo/),但在wheel.supported_platforms
上,它返回一个空数组,我不能做任何事情(一个轮子"任何";或者加上"win32";在平台部分的名称上,返回了一个空数组,所以我似乎不能使用它)。
也尝试了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.
这使得该命令无法使用,即使它打印"Compatible标记",我或多或少可以使用该标记从其名称来确定是否支持轮子。"兼容标签"的例子在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"one_answers";win_amd64"(就像我之前做的那样),但是接下来我需要确切地知道名称的各个部分可能具有的所有可能性(我在文档中看到一个很酷的表达式:"例如;;(这意味着还有比上面提到的更多的东西),我们在这方面做了很多工作。我希望已经有人做了这样的事情(也许甚至Python本身在它的任何内部包中都有一些方法)。
您可以使用打包。
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