Boost.Python: 初步介绍

来源:互联网 发布:nba2k16樱木捏脸数据 编辑:程序博客网 时间:2024/05/21 17:53

Boost.Python介绍

Boost.Python简单概括:是Boost库的一部分;用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针。

想要了解Boost.Python,可以参考Boost.Python文档

BoostPython库让C++和Python几乎无缝结合,是Boost库的一个功能。
用BoostPython库,能快速、容易地将C++输出到Python,使得Python接口和C++接口非常像。它被设计成尽可能贴近你的C++设计。大多数情况下,你不需要修改C++类就能在Boost.Python中使用它。系统会简单地映射你的C++类和函数到Python。Boost.Python的这种绑定,是纯C++实现的,除了编辑器和编译器你什么别的都不需要。

Boost.Python和Python C API的关系

Python已经提供了API,用于粘合Python和C。那Boost::Python又是什么?Boost::Python是Python/C API的一个封装(wrapper)。

使用Python/C API,你需要在Python和C代码之间传递指针的前后,手动处理指针问题,比如指针不再指向原来的对象时,Boost::Python接管了这项任务,自动处理。此外,Boost::Python使我们能用C++的OOP方式,在Python对象上写操作。

C++封装

我们知道,C++的代码封装机制和C有所不同,相比真正的纯C语言,C++更为复杂。例如,它有虚函数,有模版,前者使运行时更为复杂和灵活,后者使一些比宏更复杂的语法推导得以实现。Boost.Python为C++程序提供的封装能力,正是基于template。我们要做的,是把C++程序中的函数、类、数据成员等等,都变成Python对象。
BOOST.Python封装了各平台的Python动态链接库接口,我们要做的只是调用它,封装需要暴露的定义,然后指示编译器生成动态链接库即可。

用了Boost:Python后仍然可以用Python/C API写东西。甚至都不必引入python.h头文件,就可以用相关的函数了。比如在C++中清除掉一个Python错误,可以在一个Boost::Python程序中插入这行:

PyErr_Clear();

在C++中,Python/C API用PyObject指针来表示Python对象。而在Boost::Python中,这些用boost::python::object类的实例来封装(替代了直接用指针的表示)。

你如果需要某个boost::python::object的PyObject,可以通过boost::python::object的ptr()方法来获取到,它返回的是一个PyObject*。然后你可以使用Python/C API调用。比如,我有个boost::python:object的实例叫boostObj,我想知道它是否有一个叫做myAttributeName的属性,那就:

PyObject_HasAttrString(boostObj.ptr(), "myAttributeName");