Boost.Python简单概括:是Boost库的一部分;用来在C++代码中调用python代码以及在Python代码中调用C++代码,并且避免用户直接操作指针。
以下内容搬运自:https://wiki.python.org/moin/boost.python/GettingStarted
简介
BoostPython库让C++和Python几乎无缝结合,是Boost库的一个功能。
用BoostPython库,能快速、容易地将C++输出到Python,使得Python接口和C++接口非常像。它被设计成尽可能贴近你的C++设计。大多数情况下,你不需要修改C++类就能在Boost.Python中使用它。系统会简单地映射你的C++类和函数到Python。Boost.Python的这种绑定,是纯C++实现的,除了编辑器和编译器你什么别的都不需要。
Python C++-sig(http://www.python.org/sigs/current/cplusplus-sig/)维护了本库用户邮件列表。当前版本文档在`http://www.boost.org/libs/python/。开发文档在
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/boost/boost/libs/python/doc/index.html`可以查到,往往是最新的。
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对象上写操作。
比如,对于Python代码y=object_x[i]
,同样的功能用Python/C API实现,需要这样写:
y=PySequence_GetItem(object_x, i);
作为对比,用Boost::Python这样写就行了:
y=object_x[i];
此外,Boost::Python使得将我们的C++类输出为Python变得容易,甚至都不需要改变。Boost::Python的设计理念是:用户永远不需要接触PyObject*
。
如果你需要潜在Python/C API
用了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");