您的位置:首页 > 编程语言 > Python开发

boost::python的使用

2015-03-13 14:52 127 查看
boost::python库是pyhon和c++相互交互的框架,可以再python中调用c++的类和方法,也可以让c++调用python的类和方法

python自身提供了一个Python/C API用来实现python和c++的交互,boost::python是Python/C API的包装,所以用起来更简单一些。

Python对一个动态类型的语言,C++是一个静态类型的语言,对于Python中的变量类型,Boost.Python都有相应的类对应,他们都是boost::python::object的子类。boost::python::object 包装了PyObject *, 通过这种方式c++可以平滑的操作python对象。Boost.Python的主要目标既保持Python的编程风格同时又提供C++和Python的双向映射。

python代码:

def f(x, y):
if(y =='foo'):
x[3:7]='bar'
else:
x.items += y(3, x)
return x
def getfunc():
return f;


c++重写代码

object f(object x, object y){
if(y =="foo")
x.slice(3,7)="bar";
else
x.attr("items")+= y(3, x);
return x;
}
object getfunc(){
return object(f);
}


Python::Object是一个抽象父类,对Python的每个类型都实现了一个对应的子类。

list

dict

tuple

str

long_

enum

Python::Object对应一个Python对象,那么c++怎么获取Python对象的值呢,这个需要使用Python::extract方法

double d=python::extract<double>(obj)


通过PyObject*构造一个boost::python::object对象。

boost::python::object o(boost::python::handle<>(pyobj));


这样情况下. o管理pyobj, 不会增加pyobj的引用计数。

boost::python::object o(boost::python::handle<>(boost::python::borrowed(pyobj)));


这中情况下,会调用
Py_INCREF ,当O对象生命周期结束 ,pyobj不会析析构掉


怎么从python::object对象中获取PyObject* :

obj.ptr()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: