4.建立 C 與 C++ 擴充套件

一個 CPython 的 C 擴充套件是一個共用函式庫(例如在 Linux 上的.so 檔案,在 Windows 上的.pyd),會匯出一個初始化函式

要能夠被引入,共用函式庫必須在PYTHONPATH 上可用,並且必須以模組名稱命名,並且必須有適當的副檔名。使用 setuptools 時,正確的檔名會自動產生。

初始化函式具有簽名:

PyObject*PyInit_modulename(void)

它回傳一個完全初始化的模組,或一個PyModuleDef 實例。詳細資訊請參見初始化 C 模組

對於僅包含 ASCII 名稱的模組,函式必須以PyInit_<modulename> 命名,其中<modulename> 要替換為模組的名稱。當使用Multi-phase initialization 時,允許非 ASCII 模組名稱。在這種情況下,初始化函式名稱是PyInitU_<modulename>,其中<modulename> 使用 Python 的punycode 編碼,並將連字符號替換為底線。在 Python 中:

definitfunc_name(name):try:suffix=b'_'+name.encode('ascii')exceptUnicodeEncodeError:suffix=b'U_'+name.encode('punycode').replace(b'-',b'_')returnb'PyInit'+suffix

可以透過定義多個初始化函式,來從單一共用函式庫中匯出多個模組。然而要引入它們需要使用符號連結或自訂引入器,因為預設只會找到對應於檔名的函式。詳細資訊請參見PEP 489 中的"Multiple modules in one library" 部分。

4.1.用 setuptools 建置 C 與 C++ 擴充套件

Python 3.12 與之後的版本不再帶有 distutils。請在https://setuptools.readthedocs.io/en/latest/setuptools.html 上參閱setuptools 文件,以了解如何使用 setuptools 建置和發佈 C/C++ 擴充套件。