Python 声明了一个 C-API(参见http://docs.python.org/2/c-api/或http://docs.python.org/3/c-api/)。这个 API 定义了一个通用的对象类型PyObject,它只是一个普通的 C 结构体。这个结构定义了(几乎)python 对象可以做的所有事情,例如,当对这个对象进行加法或比较时会发生什么,或者像函数一样简单地调用它。
因为 python 类型也是对象(因此在 C 中由PyObject结构表示),定义一个新类型是一个简单的事情,定义一个PyObject像这样的新结构。在 Python 中调用方法时,解释器会将调用转发到与此结构关联的 C 函数。
只要给定的(编译的)扩展提供了正确的入口点,这样 Python 解释器就可以自省它并找出可用的东西(我上面指出的文档确实详细解释了这一点),然后它就可以像使用其他任何对象一样使用这些对象您通常在提示符下可用的对象 - 顺便说一句,是使用完全相同的 C-API 构造的。import编译后的扩展就足够了。
我希望对 Python 解释器如何从上面编译的扩展中调用内容有所了解。唯一缺失的差距是 C-API 调用 C++ 代码的方式。
Boost.Python 通过在代码中声明 C 入口点来实现这一点,如下所述:Elegantly call C++ from C。每次调用时,例如,boost::python::class_它都会针对您向 python 声明的类型执行此操作,因此创建一个PyObject代表您的类的类,并使用您选择的名称。当你调用.def这个类时,你会填充该结构的内部槽,声明更多新类型的方法、运算符和属性。这些内部槽中的每一个都指向一个 C 风格的函数,它只不过是等效 C++ 调用的包装器。