这取决于后端;并非所有构建后端都支持 PEP 384。
distutils
例如,当使用纯distutils
(所以
from distutils.core import setup
setup(...)
),无法更改扩展后缀;这就是为什么几年前我不得不问更改 Cython 对 .so 文件的命名规则的问题。但是你现在不应该使用 pure 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 标签。
车轮标签是一个不同的故事。它独立于它打包的扩展名。要设置有限的 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
并组装正确的车轮名称。