setuptools,提前知道本机库的 wheel 文件名

setuptools, know in advance the wheel filename of a native library

在 运行 安装脚本之前,是否有一种简单的方法可以知道 Python 车轮的文件名?

我正在尝试生成一个 Bazel 规则,为机器中安装的每个 Python 版本构建一个 .whl,该库包含本机代码,因此需要为每个版本单独编译。 Bazel 的问题是它需要提前声明任何输出,而我观察到的是每个 Python 版本生成不同的文件名,没有明显的一致性(malloc 和 unicode 的前缀不同)

2.7  --> lib-0.0.0-cp27-cp27mu-linux_x86_64.whl
3.6m --> lib-0.0.0-cp36-cp36m-linux_x86_64.whl
3.8  --> lib-0.0.0-cp36-cp38-linux_x86_64.whl

我知道作为一种解决方法,我可以拉动轮子来传递它,但我想知道是否有更简洁的方法来做到这一点。

更新

另请参阅更详细的答案

您可以通过查询 bdist_wheel 命令来获取名称,因为您甚至不需要构建任何东西或编写 setup.py 脚本(但您需要传递给setup 函数)。示例:

from distutils.core import Extension
from setuptools.dist import Distribution


fuzzlib = Extension('fuzzlib', ['fuzz.pyx'])  # the files don't need to exist
dist = Distribution(attrs={'name': 'so', 'version': '0.1.2', 'ext_modules': [fuzzlib]})
bdist_wheel_cmd = dist.get_command_obj('bdist_wheel')
bdist_wheel_cmd.ensure_finalized()

distname = bdist_wheel_cmd.wheel_dist_name
tag = '-'.join(bdist_wheel_cmd.get_tag())
wheel_name = f'{distname}-{tag}.whl'
print(wheel_name)

会打印出你想要的名字。请注意,传递给 Distributionattrs 应该包含传递给 setup 函数的相同元数据,否则您可能会得到错误的标记。要重用元数据,在 setup.py 脚本中可以将其组合,例如

setup_kwargs = {'name': 'so', 'version': '0.1.2', ...}

dist = Distribution(attrs=setup_kwargs)
...
setup(**setup_kwargs)