4. 构建C/C++扩展¶

一个CPython的C扩展是一个共享库(例如一个Linux上的 .so ,或者Windows上的 .pyd ),其会导出一个 �始化函数 。

为了�导入,共享库必须在 PYTHONPATH 中列出,且必须按照模��称命�,并带有正确的扩展�。 当使用 setuptools 时,会自动生�正确的文件�。

�始化函数的声明如下:

PyObject *PyInit_modulename(void)¶

该函数返回完整�始化过的模�,或一个 PyModuleDef 实例。 请查看 �始化 C 模� 了解详情。

对于仅有ASCII编�的模��,函数必须是 PyInit_<modulename> ,将 <modulename> 替�为模�的�字。当使用 多阶段�始化 时,�许使用�ASCII编�的模��。此时�始化函数的�字是 PyInitU_<modulename> ,而 <modulename> 需�用Python的 punycode 编�,连字�需替�为下划线。在Python里:

def initfunc_name(name):
    try:
        suffix = b'_' + name.encode('ascii')
    except UnicodeEncodeError:
        suffix = b'U_' + name.encode('punycode').replace(b'-', b'_')
    return b'PyInit' + suffix

�以在一个动�库里导出多个模�,通过定义多个�始化函数。而导入他们需�符�链接或自定义导入器,因为缺�时�有对应了文件�的函数�会被�现。查看 "一个库里的多模�" 章节,在 PEP 489 了解更多细节。

4.1. 使用 setuptools 构建 C 和 C++ 扩展¶

Python 3.12 �更新的版本��包� distutils。 请�考 https://setuptools.readthedocs.io/en/latest/setuptools.html 上的 setuptools 文档�更多地了解如何使用 setuptools �构建和分� C/C++ 扩展。