首页 > 编程 > Python > 正文

如何利用Boost.Python实现Python C/C++混合编程详解

2020-02-15 23:33:23
字体:
来源:转载
供稿:网友

前言

学习中如果碰到问题,参考官网例子:

D:/boost_1_61_0/libs/python/test

参考:Boost.Python 中英文文档。

利用Boost.Python实现Python C/C++混合编程

关于python与C++混合编程,事实上有两个部分

extending 所谓python 程序中调用c/c++代码, 其实是先处理c++代码, 预先生成的动态链接库, 如example.so, 而在python代码中import example;即可使用c/c++的函数 . embedding c++代码中调用 python 代码.

两者都可以用 python c 转换api,解决,具体可以去python官方文档查阅,但是都比较繁琐.

对于1,extending,常用的方案是boost.python以及swig.

swig是一种胶水语言,粘合C++,PYTHON,我前面的图形显示二叉树的文章中提到的就是利用pyqt作界面,调用c++代码使用swig生成的.so动态库.

而boost.python则直接转换,可以利用py++自动生成需要的wrapper.关于这方面的内容的入门除了boost.python官网,中文的入门资料推荐

下面话不多说了,来一起看看详细的介绍吧

导出函数

#include<string>#include<boost/python.hpp>using namespace std;using namespace boost::python;char const * greet(){ return "hello,world";}BOOST_PYTHON_MODULE(hello_ext){ def("greet", greet);}

python:

import hello_extprint hello_ext.greet()

导出类:

导出默认构造的函数的类

c++

#include<string>#include<boost/python.hpp>using namespace std;using namespace boost::python;struct World{ void set(string msg) { this->msg = msg; } string greet() { return msg; } string msg;};BOOST_PYTHON_MODULE(hello) //导出的module 名字{ class_<World>("World") .def("greet", &World::greet) .def("set", &World::set);}

python:

import hello planet = hello.World() # 调用默认构造函数,产生类对象planet.set("howdy") # 调用对象的方法print planet.greet() # 调用对象的方法

构造函数的导出:

#include<string>#include<boost/python.hpp>using namespace std;using namespace boost::python;struct World{ World(string msg):msg(msg){} //增加构造函数 World(double a, double b):a(a),b(b) {} //另外一个构造函数 void set(string msg) { this->msg = msg; } string greet() { return msg; } double sum_s() { return a + b; } string msg; double a; double b;};BOOST_PYTHON_MODULE(hello) //导出的module 名字{ class_<World>("World",init<string>())  .def(init<double,double>()) // expose another construct .def("greet", &World::greet) .def("set", &World::set) .def("sum_s", &World::sum_s);}

python 测试调用:

import helloplanet = hello.World(5,6)planet2 = hello.World("hollo world")print planet.sum_s()print planet2.greet()            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表