Boost.Python 是如何工作的?

Posted

技术标签:

【中文标题】Boost.Python 是如何工作的?【英文标题】:How does Boost.Python work? 【发布时间】:2010-09-14 19:16:18 【问题描述】:

当解释器是 C 并且使用 C 编译器构建时,Python 如何调用 C++ 对象?

【问题讨论】:

【参考方案1】:

Boost.Python 有特殊的宏,用extern "C" 声明函数,因此 Python 解释器将能够调用它们。这有点复杂,但您可以查看Boost documentation 了解更多信息。

【讨论】:

【参考方案2】:

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++ 调用的包装器。

【讨论】:

【参考方案3】:

C++ 可以通过 extern "C" 声明与 C 互操作。

【讨论】:

以上是关于Boost.Python 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Python 如何拥有 C++ 类?

如何组织 python / Boost Python 项目

如何通过 Boost.Python 从 python 文件中导入函数

如何使用boost.python中的-fPIC编译静态库

Boost.Python不是.lib

Boost.Python 对象的 id