【问题标题】:python: create wheel from existing c extensionpython:从现有的 c 扩展创建轮子
【发布时间】: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


【解决方案1】:

不是一个完美的解决方案,但使用wheel 模块时会创建一个功能轮:

from setuptools import setup

setup(name='my_module',
      packages=['my_module'],
      package_data={'': ['*.so', '*.pyi']},
      )

创建轮子:

pip install wheel
pip wheel .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2016-11-04
    相关资源
    最近更新 更多