Dr *_*Leo 3 c python distutils setuptools distutils2
mymodule.c 启动如下:
#define PY_SSIZE_T_CLEAN
#define Py_LIMITED_API 0x03070000
#include "Python.h"
Run Code Online (Sandbox Code Playgroud)
它构建时没有错误和警告。然而,生成的文件被命名为
mymodulename.cpython-37m-x86_64-linux-gnu.so
Run Code Online (Sandbox Code Playgroud)
构建命令:
$ python setup.py build
Run Code Online (Sandbox Code Playgroud)
当我改为发出
$ pip wheel .
Run Code Online (Sandbox Code Playgroud)
轮子中包含的扩展名称相同,因此轮子也没有 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(...)
Run Code Online (Sandbox Code Playgroud)
),无法更改扩展名后缀;这就是为什么几年前我不得不问“更改 Cython 的 .so 文件命名规则”这个问题。但无论如何,现在您不应该使用 pure distutils,因此本节只是为了完整起见。
setuptools如果使用,则在创建对象时setuptools必须传递。例子:py_limited_api=TrueExtension
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),
],
)
Run Code Online (Sandbox Code Playgroud)
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"]),
],
)
Run Code Online (Sandbox Code Playgroud)
pip wheel:构建正确的车轮标签当我发出
Run Code Online (Sandbox Code Playgroud)$ pip wheel .轮子中包含的扩展名称相同,因此轮子也没有 ABI3 标签。
车轮标签的情况有些不同。它独立于它所打包的扩展名称。要设置有限的 ABI,当以通常的方式构建轮子时,可以发出
$ python setup.py bdist_wheel --py-limited-api=cp37
Run Code Online (Sandbox Code Playgroud)
由此产生的轮子将被命名为<pkg>-<ver>-cp37-abi3-<platform>.whl。
但是,这不起作用pip wheel,因为您无法将选项传递给子bdist_wheel命令。因此,您可以将其保留在setup.cfg:
# setup.cfg
[bdist_wheel]
py_limited_api = cp37
Run Code Online (Sandbox Code Playgroud)
现在运行时pip wheel .,bdist_wheel将从中选择选项setup.cfg并组装正确的轮名称。