4. C および C++ 拡張のビルド¶
CPython の C 拡張は 初期化関数 をエクスポートした共有ライブラリ (例、 Linux の .so
ファイルや Windows の .pyd
ファイル) です。
インポートできるように、共有ライブラリは使える状態で PYTHONPATH
上になければならず、ファイル名をモジュール名に揃え、適切な拡張子になっていなければいけません。 setuptools を使っているときは、自動的に正しいファイル名が生成されます。
初期化関数のシグネチャは次のとおりです:
この関数は完全に初期化されたモジュールか、 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
のドキュメントを参照してください。