首页 > 解决方案 > setuptools,提前知道原生库的wheel文件名

问题描述

在运行设置脚本之前,有没有一种简单的方法可以知道 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

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

标签: pythonsetuptoolspython-wheel

解决方案


更新

另请参阅此处的更详细答案。

您可以通过查询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)

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

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

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

推荐阅读