4. 构建C/C++扩展¶
一个CPython的C扩展是一个共享库(例如一个Linux上的 .so ,或者Windows上的 .pyd ),其会导出一个 �始化函数 。
为了å�¯å¯¼å…¥ï¼Œå…±äº«åº“必须在 PYTHONPATH ä¸åˆ—出,且必须按照模å�—å��称命å��,并带有æ£ç¡®çš„æ‰©å±•å��。 当使用 setuptools 时,会自动生æˆ�æ£ç¡®çš„æ–‡ä»¶å��。
�始化函数的声明如下:
该函数返回完整�始化过的模�,或一个 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++ 扩展。