boost::python的使用


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代碼:
  1. def f(x, y):
         if(y =='foo'):
             x[3:7]='bar'
         else:
             x.items += y(3, x)
         return x
    def getfunc():
       return f;
c++重寫代碼
  1. 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方法
  1. double d=python::extract<double>(obj)
通過PyObject*構造一個boost::python::object對象。
boost::python::object o(boost::python::handle<>(pyobj));
這樣情況下. o管理pyobj, 不會增加pyobj的引用計數。
  1. boost::python::object o(boost::python::handle<>(boost::python::borrowed(pyobj)));
這中情況下,會調用 Py_INCREF ,當O對象生命周期結束 ,pyobj不會析析構掉
 
怎么從python::object對象中獲取PyObject* :
  1. obj.ptr()

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM