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

     

 

posted @   高兴的博客  阅读(14993)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示