zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    轻松实现 网络视频播放器
    端口扫描 多方式协同实现
    关于部分应用无法向POJ提交代码的解决方案
    一套跨平台五子棋网游的开发经历
    SSH2.0编程 ssh协议过程实现
    ssh秘钥交换详解与实现 diffie-hellman-group-exchange-sha
    OnlineJudge 离线题库采集
    SOCKET 实现NAT 穿越
    基于公网smtp协议实现邮件服务器
    周六搞事情,微信小程序开发文档已放出!
  • 原文地址:https://www.cnblogs.com/gaoxing/p/4335148.html
Copyright © 2011-2022 走看看