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()