# 擴充和嵌入 Python 直譯器

這份說明文件描述如何在 C 或 C++ 中編寫模組，並使用新模組來擴充 Python 直譯器功能。那些模組不僅可以定義新的函式，也可以定義新的物件型別及其方法 (method)。文件內容也會描述如何將 Python 直譯器嵌入另一個應用程式中，做為一種擴充語言 (extension language) 使用。最後，它會展示如何編譯及連結擴充模組，使那些模組可以動態地（在運行時）被載入到直譯器中，前提是底層作業系統有支援這個功能。

這份說明文件假設您具備 Python 的基礎知識。關於此語言的非正式介紹，請參閱 Python 教學。Python 語言參考手冊給予此語言更為正式的定義。Python 標準函式庫 (Standard Library) 記錄了賦予此語言廣泛應用範圍的物件型別、函式與（內建的和以 Python 編寫的）模組。

關於完整的 Python/C API 詳細介紹，請參閱另外一份 Python/C API 參考手冊。

## 推薦的第三方工具

這份指南僅涵蓋了此 CPython 版本所提供的、用以建立擴充的基本工具。第三方工具，例如 Cython、cffi、SWIG 和 Numba，提供了更為簡單及更為複雜的多種方法，來為 Python 建立 C 和 C ++ 擴充。

也參考

Python 封裝使用者指南：二進制擴充

  Python 封裝使用者指南 (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. Adding data and methods to the Basic example
  - 2.3. Providing finer control over data attributes
  - 2.4. Supporting cyclic garbage collection
  - 2.5. Subclassing other types
- 3. 定义扩展类型：已分类主题
  - 3.1. 终结和内存释放
  - 3.2. 对象展示
  - 3.3. 属性管理
  - 3.4. Object Comparison
  - 3.5. Abstract Protocol Support
  - 3.6. Weak Reference Support
  - 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 的实际使用

## 在更大的應用程式中嵌入 CPython 運行環境 (runtime)

有時候，相較於建立一個擴充，使其在 Python 直譯器中可作為主應用程式運行，還不如將 CPython 運行環境嵌入至一個更大的應用程式中更可取。本節將涵蓋一些要成功完成此任務所涉及的細節。

- 1. 在其它 App 內嵌入 Python
  - 1.1. 高层次的嵌入
  - 1.2. 突破高层次嵌入的限制：概述
  - 1.3. 纯嵌入
  - 1.4. 对嵌入 Python 功能进行扩展
  - 1.5. 在 C++ 中嵌入 Python
  - 1.6. 在类 Unix 系统中编译和链接