如果解释器是C语言,并且是用C编译器构建的,Python如何能够调用C++对象?
发布于 2010-09-15 03:34:29
Python有特殊的宏用extern "C"
声明函数,因此Boost.Python解释器将能够调用它们。这有点复杂,但你可以查看Boost documentation了解更多信息。
发布于 2013-07-04 02:30:10
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解释器就可以内省它并找出可用的东西(我上面提到的文档详细解释了这一点),然后它就可以像通常在提示符处提供的任何其他对象一样使用这些对象-这些BTW都是使用完全相同的C-API构造的。对编译后的扩展执行import
就足够了。
我希望大家都清楚Python解释器是如何从上面编译的扩展中调用东西的。唯一缺少的差距是C-API调用C++代码的方式。
Boost.Python通过在代码中声明C入口点来实现这一点,如下所示:Elegantly call C++ from C。每次你调用boost::python::class_
时,它都会为你声明给python的类型做这件事,因此用你选择的名字创建一个代表你的类的PyObject
。当你在这个类上调用.def
时,你可以填充这个结构的内部槽,声明更多的新类型的方法、运算符和属性。这些内部槽中的每一个都指向一个C风格的函数,该函数只不过是等效C++调用的包装器。
发布于 2010-09-15 03:33:30
C++可以通过外部"C“声明与C进行互操作。
https://stackoverflow.com/questions/3712125
复制相似问题