# Python インタプリタの拡張と埋め込み

このドキュメントでは、Pythonインタプリンタを拡張する新しいモジュールをで C またはC++ で書く方法を解説しています。このようなモジュールでは新しい関数を定義するだけではなく、新しい型や、そのメソッドを定義することができます。ドキュメントでは他のアプリケーションでPythonを拡張言語として使用するために、Pythonインタプリタをアプリケーションに埋め込む方法についても解説します。最後に、下層のオペレーティングシステムが動的(実行時)ロードをサポートしていれば、拡張モジュールが動的にライブラリにロードされるように、モジュールをコンパイルしリンクする方法について解説します。

このドキュメントでは、読者は Python について基礎的な知識を持ち合わせているものと仮定しています。形式ばらない Python 言語の入門には、 Python チュートリアル を読んでください。 Python 言語リファレンス を読めば、 Python 言語についてより形式的な定義を得られます。また、 Python 標準ライブラリ では、Python に広い適用範囲をもたらしている既存のオブジェクト型、関数、および (組み込み、および Python で書かれたものの両方の) モジュールについて解説しています。

Python/C API 全体の詳しい説明は、別のドキュメントである、 Python/C API リファレンスマニュアル を参照してください。

## おすすめのサードパーティツール

このガイドがカバーするのは、このバージョンの CPython の一部として提供されている、拡張を作成するための基本的なツールだけです。 Cython, cffi, SWIG, Numba のようなサードパーティのツールは、 Python の C および C++ 拡張を作成するための、より簡潔かつより洗練された手法を提供します。

参考

Python Packaging User Guide: Binary Extensions

  Python Packaging User Guideはバイナリ拡張の作成が簡単になる便利なツールをカバーしているだけではなく、まず始めになぜ拡張モジュールを作ることが望ましいかの様々な理由について議論しています。

## サードパーティツールなしで拡張を作る

ガイドのこの節ではサードパーティツールの補助無しに C および C++ 拡張を作成する方法を説明します。 これは自分自身の C 拡張を作成するおすすめの方法というよりも、主にそれらのツールを作成する人向けのものです。

- 1. C や C++ による Python の拡張
  - 1.1. 簡単な例
  - 1.2. 幕間小話: エラーと例外
  - 1.3. 例に戻る
  - 1.4. モジュールのメソッドテーブルと初期化関数
  - 1.5. コンパイルとリンク
  - 1.6. C から Python 関数を呼び出す
  - 1.7. 拡張モジュール関数でのパラメタ展開
  - 1.8. 拡張モジュール関数のキーワードパラメタ
  - 1.9. 任意の値を構築する
  - 1.10. 参照カウント法
  - 1.11. C++での拡張モジュール作成
  - 1.12. 拡張モジュールに C API を提供する
- 2. 拡張の型の定義: チュートリアル
  - 2.1. 基本的なこと
  - 2.2. 基本のサンプルにデータとメソッドを追加する
  - 2.3. データ属性をこまかく制御する
  - 2.4. 循環ガベージコレクションをサポートする
  - 2.5. 他の型のサブクラスを作る
- 3. Defining Extension Types: Assorted Topics
  - 3.1. ファイナライズとメモリ解放
  - 3.2. オブジェクト表現
  - 3.3. 属性を管理する
  - 3.4. オブジェクトの比較
  - 3.5. 抽象的なプロトコルのサポート
  - 3.6. 弱参照(Weak Reference)のサポート
  - 3.7. その他いろいろ
- 4. C および C++ 拡張のビルド
  - 4.1. distutils による C および C++ 拡張モジュールのビルド
  - 4.2. 拡張モジュールの配布
- 5. Windows 上での C および C++ 拡張モジュールのビルド
  - 5.1. 型どおりのアプローチ
  - 5.2. Unix と Windows の相違点
  - 5.3. DLL 使用の実際

## 大規模なアプリケーションへの Python ランタイムの埋め込み

Python インタープリタの中でメインアプリケーションとして実行される拡張を作るのではなく、 CPython をより大きなアプリケーションの中に埋め込む方が望ましいことがあります。 この節ではその上手い埋め込みに関わる詳細について説明します。

- 1. 他のアプリケーションへの Python の埋め込み
  - 1.1. 高水準の埋め込み
  - 1.2. 超高水準の埋め込みから踏み出す: 概要
  - 1.3. 純粋な埋め込み
  - 1.4. 埋め込まれた Python の拡張
  - 1.5. C++による Python の埋め込み
  - 1.6. Unix 系システムにおけるコンパイルとリンク