Introduction
简介
The Application Programmmer's Interface to Python gives C and C++ programmers access to the Python interpreter[] an a variety[] of levels.The API is equally usable from C++,but for brevity it is generally referred to as th PYthon/C API. There are tow fundamentally different reasons for using the Python/C API.The first reasons is to probable the most common use.The second reason is to use Python as component in a larger application;this technique is generally referred to as embedding Python in an application.
Python程序编程接口给C/C++编程者提供了对Python不同层次的访问.API同样的可以在C++使用,但是简单的来讲,主要适用于Python/C API.使用Python/C API有两个重要的原因.第一个是为了特定的目的编写扩展模块;这是用C模块来扩展Python解释器. 这或许是阳常见的一个用途. 另外一个原因是使用Python作为一个大型工程的组件,这通常称为将Python嵌入一个程序.
Writing an externsion module is a relatively well-understood process,where a "cookbook" approoach works well.There are several tools that automate the process to some extent.While people have embedded Python in other application since its early existence,the process of embedding Python is less straightforward than writing an extension.
编写扩展模块通常是一个比较易懂的过程,通过简明手册就可以很好的工作. 有几个工具可以自动化整个过程. 早期的时候人们将Python嵌入到其它程序中去,这个过程没有写一个扩展模块来的直接.
Many API functions are useful imdependent of whether you'are embedding or extending Python; moreover,most application that embed Python will need to provide a custom externsion as well,so it's probably a good idea to become familiar with writing an extension before attempting to embed Python in a real application.
很多的API是独立的,不论你是嵌入使用还是扩展使用. 进一步来讲,大部分的程序嵌入使用Python,还是需要同时提供一个客制化的扩展模块. 因此,好的方法就是熟悉扩展的使用,在你尝试将Python嵌入一个真实的程序中去时.
1.1 包含文件
所有使用Python/C API的函数、类型和宏定都必须在你的代码中包含如下文件:
#include "Python.h"
这意味着同时也将这些标准头文件包含进来了:<stdio.h>,<string.h>,<errno.h>,<limits.h>,和<stdlib.h>(如果可用).
注意:因为Python可能定义一些预处理,在一些系统上可能会影响到标准头文件,你必须在所有标准头文件之前包含Python.h.
在Python.h定义的所有使用者可见的名称都有Py或者_Py作为前缀. 以_Py开始的命名是Python内部实现使用的,不能用于编写扩展模块.结构成员的命名没有前缀限制.
重要:用户自定义的代码不应该以Py或_Py开头来命名. 这会使读者混淆.同时危害自定义代码对后续Python版本的可移植性,因为后续版本有可能会用到以这些前缀命名的名称.
头文件是随Python安装的.在Unix系统中,它们存放于prefix/include/pythonversion/和exec_prefix/include/pythonversion/,prefix和exec_prefix取决于Python配置脚本的对应参数.version是由sys.version[:3]定义的.在windows系统上,头文件安装在prefix/include下,prefix是由安装程序定义的安装目录.
包含这些头文件,在你编译器查找includes路径的目录中放置这些文件.不要放置父目录到查找路径中,否则,你需要使用#include <pythonX.Y/Python.h>; 这会破坏跨平台的编译.
C++的使用者要注意,虽然API完全是用C语言定义的. 但是头文件可以适用于通过extern C声明的入口,因此,无需特别去做什么事情,就可以在C++中使用.
1.2 对象,类型和引用计数
大多数的Python/C API都有一个或多个参数以及一个PyObject*类型的返回值. 这种类型是一个指向隐式的,代表任意的Python对象的指针.因为所有的Python对象在大多数的情况下被以同样的方式对待(例如:分配,透视规则和参数传递),它们只有在单个C类型表示时才是合适的. 几乎所有的Python对象都存在于heap: 你永远不可能声音一个自动或一个静态的Python变量. 只有PyObject类型的指针可以声明. 唯一的例外是类型对象:因为这些对象一定不可以被释放,它们是典型的PyTypeObject对象.
所有的Python对象(即使Python整型对象)都有一个类型和引用计数.一个对象的类型取决于对象本身(例如:整型,列表或是一个用户自定义功能;更多的解释请参考标准类型层次). 对于每个众所周知的类型都有一个宏去检查对象是否属于那种类型;举例,PyList_Check(a)为真当且仅当对象a指向一个Python列表。
1.2.1 引用计数
引用计数非常重要,因为当前的电脑内存不是无限大小的. 它用来计算出有多少不同的地方引用了对象. 这些引用的地方可以是另外一个对象或是全局的C变量,或是一个在某些C函数中的本地变量.