当解释器是C并且使用C编译器构建时,Python如何能够调用C ++对象?
答案 0 :(得分:7)
Boost.Python有一些特殊的宏,用extern "C"
声明函数,因此Python解释器可以调用它们。这有点复杂,但您可以查看Boost documentation以获取更多信息。
答案 1 :(得分:4)
Python声明了一个C-API(参见http://docs.python.org/2/c-api/或http://docs.python.org/3/c-api/)。此API定义了一个名为PyObject
的通用对象类型,它只是一个普通的C结构。这个结构定义了(几乎)python对象可以做的所有事情,例如,当对这个对象进行添加或比较或简单地将其称为函数时会发生什么。
因为python类型也是对象(因此用PyObject
结构在C中表示),所以定义一个新类型就像定义一个新的PyObject
结构一样简单。在Python中调用方法时,解释器会将调用转发给与此结构关联的C函数。
只要给定(已编译)扩展提供正确的入口点,以便Python解释器可以内省它并找出可用的内容(我上面指出的文档确实详细解释了这一点),那么它可以使用这些对象就像你通常在提示符下可用的任何其他对象一样 - BTW是使用完全相同的C-API构建的。只需import
已编译的扩展名即可。
我希望Python解释器如何从上面的编译扩展中调用东西。唯一缺失的是C-API如何调用C ++代码。
Boost.Python通过在代码中声明C入口点来实现这一点,如下所述:Elegantly call C++ from C。每当你打电话时,例如boost::python::class_
,它就会为你声明为python的类型执行此操作,因此创建一个代表你的类的PyObject
,并使用你选择的名称。当您在此类上调用.def
时,您将填充该结构的内部插槽,声明新类型的更多方法,运算符和属性。每个内部插槽都指向一个C风格的函数,它只是等效C ++调用的包装器。
答案 2 :(得分:2)
C ++可以通过extern“C”声明与C互操作。