当解释器是 C 并且使用 C 编译器构建时,Python 如何调用 C++ 对象?
3 回答
Boost.Python 有特殊的宏来声明函数,extern "C"
因此 Python 解释器将能够调用它们。这有点复杂,但您可以查看Boost 文档以获取更多信息。
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 入口点来做到这一点,如下所述:从 C 优雅地调用 C++。每次您调用时,例如,boost::python::class_
它都会为您声明给 python 的类型执行此操作,因此创建一个PyObject
代表您的类的 a,使用您选择的名称。当你调用.def
这个类时,你会填充该结构的内部槽,声明新类型的更多方法、运算符和属性。这些内部插槽中的每一个都指向一个 C 风格的函数,该函数只不过是等效 C++ 调用的包装器。
C++ 可以通过 extern "C" 声明与 C 进行互操作。