微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何构建符合 PEP384 的 Python 扩展模块并使用正确的 ABI3 标签对其进行打包? distutilssetuptoolssetuptools_rustpip wheel:构建正确的轮子标签

如何解决如何构建符合 PEP384 的 Python 扩展模块并使用正确的 ABI3 标签对其进行打包? distutilssetuptoolssetuptools_rustpip wheel:构建正确的轮子标签

mymodule.c 启动如下:

#define PY_SSIZE_T_CLEAN
#define Py_LIMITED_API 0x03070000 
#include "Python.h"

它构建时没有错误和警告。然而,生成文件名为

mymodulename.cpython-37m-x86_64-linux-gnu.so

构建命令:

$ python setup.py build

当我改为发布时

$ pip wheel .

轮子中包含的扩展名相同,因此轮子也没有 ABI3 标签

我希望使用 abi3 或类似的文件名,如 PEP 425 中所述。

到目前为止,我的研究令人沮丧。我查看了 PEP 384 和 425、docs.python.org 上的文档和相关教程,尤其是它的 C/API 和 distutils、来自 PYPA 的文档、有关 setuptools、wheel 和 pip 的文档 - 无济于事。

当前 Python 源发行版中包含的文件 /modules/xxmodule.c 仅具有历史意义。
在这里错过了什么?

解决方法

这取决于后端;并非所有构建后端都支持 PEP 384。

distutils

例如,当使用纯 distutils 时(所以

from distutils.core import setup

setup(...)

),无法更改扩展名后缀;这就是为什么我不得不在几年前提出这个问题 Change Cython's naming rules for .so files。但无论如何您现在都不应该使用纯 distutils,因此本节只是为了完整起见。

setuptools

如果您使用 setuptools,则在创建 py_limited_api=True 对象时必须传递 Extension。示例:

from setuptools import setup,Extension


setup(
    ...,ext_modules=[
        # this extension will have the SOABI suffix,e.g.
        # cpython-37m-darwin or cpython-39-x86_64-linux-gnu etc.
        Extension("foo",["foo.c"]),# this extension will have the `abi3.so` suffix
        Extension("bar",["bar.c"],py_limited_api=True),],)

setuptools_rust

奖励:如果您正在从 Rust 代码构建扩展模块并且碰巧使用 setuptools_rust,那么从 v0.11.4 开始,现在也可以构建符合 PEP 384 的扩展:

from setuptools import setup
from setuptools_rust import RustExtension


setup(
    ...,rust_extensions=[
        RustExtension("foo.rust",py_limited_api=True,features=["pyo3/abi3"]),)

pip wheel:构建正确的轮子标签

当我发出

$ pip wheel .

轮子中包含的扩展名相同,因此轮子也没有 ABI3 标签。

wheel 标签是一个有点不同的故事;它独立于它打包的扩展名。要设置有限的 ABI,在以通常的方式构建轮子时,会发出

$ python setup.py bdist_wheel --py-limited-api=cp37

生成的轮子的名称为 <pkg>-<ver>-cp37-abi3-<platform>.whl

但是,这不适用于 pip wheel,因为您无法将选项传递给 bdist_wheel 子命令。因此,您可以将其保存在 setup.cfg:

# setup.cfg
[bdist_wheel]
py_limited_api = cp37

现在运行 pip wheel . 时,bdist_wheel 将从 setup.cfg 中选择选项并组合正确的车轮名称。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。