4. C および C++ 拡張のビルド
****************************

CPython の C 拡張は *初期化関数* をエクスポートした共有ライブラリ (例
、 Linux の ".so" ファイルや Windows の ".pyd" ファイル) です。

インポートできるように、共有ライブラリは使える状態で "PYTHONPATH" 上に
なければならず、ファイル名をモジュール名に揃え、適切な拡張子になってい
なければいけません。 setuptools を使っているときは、自動的に正しいファ
イル名が生成されます。

初期化関数のシグネチャは次のとおりです:

PyObject *PyInit_modulename(void)

この関数は完全に初期化されたモジュールか、 "PyModuleDef" インスタンス
を返します。 詳しいことは Cモジュールの初期化 を参照してください。

For modules with ASCII-only names, the function must be named
"PyInit_*<name>*", with "<name>" replaced by the name of the module.
When using 多段階初期化, non-ASCII module names are allowed. In this
case, the initialization function name is "PyInitU_*<name>*", with
"<name>" encoded using Python's *punycode* encoding with hyphens
replaced by underscores. In 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

1つの共有ライブラリに複数の初期化関数を定義することで、複数のモジュー
ルをエクスポートすることは可能です。 しかし、デフォルトではファイル名
に対応した関数しか見付けようとしないので、複数のモジュールをインポート
させるにはシンボリックリンクか独自のインポーターを使う必要があります。
詳しいことは **PEP 489** の *"Multiple modules in one library"* 節を参
照してください。


4.1. setuptools による C および C++ 拡張のビルド
================================================

Python 3.12 以降には、 distutils は含まれていません。 setuptools で
C/C++ 拡張をビルドする方法について更に学ぶには、
https://setuptools.readthedocs.io/en/latest/setuptools.html にある
"setuptools" のドキュメントを参照してください。
