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

一個 CPython 的 C 擴充套件是一個共用函式庫（例如在 Linux 上的 ".so" 檔
案，在 Windows 上的 ".pyd"），會匯出一個*初始化函式*。

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

初始化函式具有簽名：

PyObject *PyInit_modulename(void)

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

對於僅包含 ASCII 名稱的模組，函式必須以 "PyInit_*<name>*" 命名，其中
"<name>" 要替換為模組的名稱。當使用 Multi-phase initialization 時，允
許非 ASCII 模組名稱。在這種情況下，初始化函式名稱是 "PyInitU_*<name>*"
，其中 "<name>" 使用 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** 中的 *"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++ 擴充套件
。
