小编Dr *_*Leo的帖子

如何构建符合 PEP 517 的 C 扩展,即使用 pyproject.toml 而不是 setup.py?

我想为 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语法的解释。

python setuptools setup.py python-packaging pyproject.toml

26
推荐指数
1
解决办法
4703
查看次数

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

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 仅具有历史意义。
我在这里缺少什么?

c python distutils setuptools distutils2

3
推荐指数
1
解决办法
839
查看次数