【发布时间】:2021-12-19 13:50:04
【问题描述】:
我们的构建管道通过 pybind11 生成 *.so / *.pyb python 扩展。作为管道中的一步,我需要将扩展打包为轮子,以便通过 pip 轻松分发。我正在尝试提出一个 setup.py,它采用现有的库并且不依赖于通过 setup.py 重新编译二进制文件(所以我真的不想要this)。这将需要对 devops 脚本进行重大重写。
当具有如下文件夹结构时:
setup.py
my_module.cpython-39-darwin.so
一个非常基本的 setup.py 可以创建一个功能轮 (python setup.py bdist_wheel):
setup(
name = 'my_module',
version='0.9.102',
packages=["."],
package_data={'': ['*.so', '*.pyi']},
)
不幸的是,轮子缺少重要的python标签和平台名称等:my_module-0.9.102-py3-none-any.whl vs. my_module-0.9.102-cp39-cp39-macosx_10_13_x86_64.whl
设置 --python-tag 和 --plat-name 有效,但设置 --py-limited-api 无效。
通过research我发现覆盖distclass会再次添加正确的标签,但Root-Is-Purelib被设置回false。不幸的是,这会在通过 pip 安装时创建一个损坏的轮子,因为它将二进制文件放在 my_module-0.9.102.data/purelib 文件夹中......
覆盖is_pure 似乎也被忽略了:
from setuptools import setup, find_packages, Distribution
class BinaryDistribution(Distribution):
def is_pure(self):
return True
def has_ext_modules(foo):
return True
setup(
name = 'my_module',
version='0.9.102',
packages=["."],
package_data={'': ['*.so', '*.pyi']},
distclass=BinaryDistribution
)
在不重写大量构建管道的情况下,我还能做些什么来将我的预编译 python 库包装到轮子上进行分发?
【问题讨论】:
-
是的,但正如我所说,我不想再次编译该项目,库已经在那里
-
如果您没有找到更好的方法,您可以随时构建 whl 文件,而无需使用 setuptools 或 disttools。它只是一个 zip 文件。
标签: python python-3.x pip setup.py python-wheel