我想为 CPython 构建一个 C 扩展。我可以按照传统方式使用setup.py文件来完成此操作。然而,由于 PEP 517 中提到的原因,我更喜欢使用pyproject.toml. 据我所知,这setuptools是唯一可以在所有相关平台上构建 C 扩展的构建后端。事实上,我不知道有任何后端能够与过时的distutils.
在此背景下,常见的情况setup.py如下所示:
from setuptools import setup, Extension
kwargs = dict(
name='mypackage',
# more metadata
ext_modules=[
Extension('mypackage.mymodule', ['lib/mymodule.c',
'lib/mypackage.c',
'lib/myalloc.c'],
include_dirs=['lib'],
py_limited_api=True)])
setup(**kwargs)
Run Code Online (Sandbox Code Playgroud)
现在,挑战是将以上内容放入 a pyproject.tomlplus a中setup.cfg。
文档setuptools建议pyproject.toml如下:
[build-system]
requires = [
"setuptools >=52.0",
'wheel >= 0.36']
build-backend = "setuptools.build_meta"
Run Code Online (Sandbox Code Playgroud)
看
此外,实际的元数据应该进入setup.cfg. 但是,我还没有找到任何关于如何将ext_moduleskwarg(特别Extension()是调用)转换为setup.cfg语法的解释。
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 仅具有历史意义。
我在这里缺少什么?