使用boost.python进行混合开发
使用boost.python进行混合开发
原文请参照官网和各方参考,本文有改动!
参考链接:http://blog.csdn.net/lanbing510/article/details/12197901
引言:
Boost.Python 是 Boost的一个组件。而 Boost是目前很红火的准 C++标准库,它提供了很多组件使得人们可以用 C++语言更方便地实现更多的功能。
Boost.Python就是 Boost众多组件中的一个。但它是个特例,它的目的不是单纯地增强 C++语言的功能,而是希望利用 C++语言来增强 Python语言的能力。使用 Boost.Python库,我可以方便地将 C++语言写的程序库用于 Python语言,可以用 Python更好地完成更多的任务。
好吧,我承认,我忘了说很重要的一点。那就是,通过 Boost.Python,我们不仅仅可以用 C++来扩展 Python,我们还可以将 Python嵌入 C++。其实 Python运行环境本身就提供了一套嵌入 Python到其它语言的 API,不过是 C语言写的。有了这套 API,我们就完全可以将 Python嵌入到 C/C++语言程序中去。但是,由于 Python本身是一门面向对象的、动态类型的语言,还带垃圾收集,而 C是个面向过程的、静态类型的、不带垃圾收集的程序设计语言。因此,直接使用这套 C API非常痛苦。
Boost.Python用面向对象 +模板的方法将这套 C API重新包装了一下,我们用起来就清爽多了。不过,目前这个包装还不完善,因此可能还是需要直接使用一部分 Python C API。等它长大了我再来介绍它。
特性包括:
1.3. 进行环境搭建:Boost1.53 可以直接进行exe安装,省去了编译的麻烦;官网可下载 boost_1_53_0-msvc-10.0-64.exe
2. 建立一个dll工程,命名为例如CSLIC:进行代码练习
2.1. 从最小的C函数开始
添加包含路径和库路径之后,添加以下包含:
#include <boost/python.hpp>
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/to_python_converter.hpp> void dummyFunc(){
cout << "Dummy function called!" << endl;
}
对应的Wrapper为:
BOOST_PYTHON_MODULE(CSLIC) {
def(fun, dummyFunc);
}
这里需要留意的是,对应的MODULE里边的那个名字必须和 命名为例如CSLIC 里边制定的库 名字完全一样,否则python导入对应的模块时候会报错误。
关于第一次环境搭建,我们需要注意的有四点:
2.2. 构建类和结构体(一个小例子)
class Complex{
public:
double real;
double imag;
Complex(double rp,double ip);
double GetArg()const;
};
使用以下胶水代码来包装:
class_<Complex>("Complex", init<double,double>())
.def_readwrite("real", &Complex::real)
.def_readwrite("imag", &Complex::imag)
.def("GetArg", &Complex::GetArg)
胶水代码的意思是,先构造一个临时对象,该对象的类型是 init<double, double> (模板类 init的一个实例),然后用字符串 "Complex"和这个临时对象构造另一个临时对象,该对象的类型是 class_<Complex>
(模板类 class_的一个实例)。然后调用第二个临时对象的 def_readwrite方法,该方法返回这个对象本身,因此可以接着再调用这个对象的 def_readwrite方法和 def方法。
一个完整的例子:
#include<cmath>
#include<boost/python.hpp>//包含 Boost.Python的头文件
class Complex { //复数类
public:
double real; //表示实部的成员
double imag; //表示虚部的成员 //构造函数,以及初始化列表
Complex(double rp,double ip):
real(rp), //初始化实部
imag(ip) { //初始化虚部
} //获取复数的幅角
double GetArg()const{
return atan2(imag, real);
}
};
usingnamespace boost::python; // 引入命名空间
BOOST_PYTHON_MODULE(CSLIC) {//胶水代码入口,导出一个名为“CSLIC”的模块
//构造一个类型为 "boost::python::class_<Complex>"的对象 pyComplex
//构造参数为字符串 "Complex"
//表示要将 C++类 Complex导出到 Python中去,名字也叫 "Complex"
class_<Complex> pyComplex("Complex", no_init);
//导出它的构造方法,声明它的构造方法有两个 double类型的参数
pyComplex.def(init<double,double>());
//导出它的公有成员 real,
//该成员在 Complex类中的位置是 &Complex::real
//导出到 Python中之后的名字也是 "real"
pyComplex.def_readwrite("real", &Complex::real);
//导出它的公有成员 imag,
//该成员在 Complex类中的位置是 &Complex::imag
//导出到 Python中之后的名字也是 "imag"
pyComplex.def_readwrite("imag", &Complex::imag);
//导出它的成员方法 GetArg
//该方法在 Complex类中的入口是 &Complex::GetArg
//导出到 Python中之后的名字也是 "GetArg"
pyComplex.def("GetArg", &Complex::GetArg);
}
生成动态连接库 ADT.so (Linux下)或
ADT.dll (Windows下)。然后我可以执行一段 Python脚本来验证一下:
我遇到的问题:
(1):对于函数重载:产生模板库不能展开问题 ErrorC2784,ErrorC2780
解决方法:消除重载,函数改名......
下边的是一个成员函数重载的例子(其实和Free funciton的唯一差别就是声明导出的时候,要在class_<T>对象的那个.后边加def,而一般函数只要直接Def即可):
////////////////////////////////////////////////////////////////////////////////
//Overloadding
struct X{
bool f(int a){
return true;
} bool f(int a, double b) {
return true;
} bool f(int a, double b, char c){
return true;
} int f(int a, int b, int c){
return a + b + c;
};
};
声明的时候,则要费时一点:
//helpers
bool (X::*fx1)(int) = &X::f;
bool (X::*fx2)(int, double) = &X::f;
bool (X::*fx3)(int, double, char)= &X::f;
int (X::*fx4)(int, int, int) = &X::f;
class_<X>("X")
.def("f", fx1)
.def("f", fx2)
.def("f", fx3)
.def("f", fx4)
(2):对于不能正常初始化问题:利用WIndepends查看后,缺少两个com组件;
打开dll文件,发现:
错误: 由于在隐性依赖模块中丢失导出函数,至少有一个模块有不能解析的导入。
错误: 发现不同 CPU 类型的模块。
警告: 至少有一个延时加载模块没找到。
警告: 由于在延时加载依赖模块中丢失导入函数,至少有一个模块具有不能解析的导入。
由于VS对64位os的支持不完善,导致大量使用32位库,造成不兼容;
解决方法: 切换到32位平台。
使用boost.python进行混合开发的更多相关文章
- [转]boost::python开发环境搭建
转自:http://www.cnblogs.com/gaoxing/p/4317051.html 本来想用mingw编译boost::python模块,网上看了下资料太少,只有使用vs2012 操作环 ...
- boost::python开发环境搭建
本来想用mingw编译boost::python模块,网上看了下资料太少,只有使用vs2012 操作环境:win7 x64 python: x86 boost: 1.57 编译boost::pytho ...
- 使用Boost.Python构建混合系统(译)
目录 Building Hybrid Systems with Boost.Python 摘要(Abstract) 介绍(Introduction) 设计目标 (Boost.Python Design ...
- boost.python笔记
boost.python笔记 标签: boost.python,python, C++ 简介 Boost.python是什么? 它是boost库的一部分,随boost一起安装,用来实现C++和Pyth ...
- 64位win7下安装Boost 1.59.0 + boost.python 1.59.0 + gccxml + pygccxml + pyplusplus(py++)
由于安装过程中实在是出现了N多问题,所以不得不专门写个帖子来记录一下这破东西在Win7下的安装过程,避免以后还要再用的时候踩坑. 1.Boost简介 Boost库是一个可移植.提供源代码的C++库,作 ...
- Python运维开发基础10-函数基础【转】
一,函数的非固定参数 1.1 默认参数 在定义形参的时候,提前给形参赋一个固定的值. #代码演示: def test(x,y=2): #形参里有一个默认参数 print (x) print (y) t ...
- boost.python入门教程 ----python 嵌入c++
Python语言简介 Python是一种脚本语言.以开放的开发接口和独特的语法著称.尽管Python在国内引起注意只有几年的时间,但实际上Python出现于上世纪90年代(据www.python.or ...
- 【转】Boost.Python
http://edyfox.codecarver.org/html/boost_python.html Boost.Python 是 Boost 中的一个组件,使用它能够大大简化用 C++ 为 Pyt ...
- 在 Windows 上使用 Python 进行 web 开发
本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上一篇我们介绍了在Windows 10下进行初学者入门开发Python的指 ...
随机推荐
- Selenium3+python自动化-iframe
一.frame和iframe区别 Frame与Iframe两者可以实现的功能基本相同,不过Iframe比Frame具有更多的灵活性. frame是整个页面的框架,iframe是内嵌的网页元素,也可以说 ...
- 深度遍历DFS---树
一.二叉树的深度 题目: 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,nul ...
- html第七节课
document 1.Window.document对象 一.找到元素: docunment.getElementById("id"):根据id找,最多找一个: var a ...
- Beautifulsoup提取特定丁香园帖子回复
DataWhale-Task3(Beautifulsoup爬取丁香园) 简要分析 完整代码 结果图 参考资料 简要分析 任务3:爬取丁香园论坛特定帖子,包括帖子主题,帖子介绍,回贴内容(用户名,用户头 ...
- ecshop3 调用指定分类下推荐/热卖/新品商品,可指定调用数量
第一步:--------------------------------------------------------------------------------------/** * 取指定分 ...
- 【Codeforces Round #519 by Botan Investments D】Mysterious Crime
[链接] 我是链接,点我呀:) [题意] 相当于问你这m个数组的任意长度公共子串的个数 [题解] 枚举第1个数组以i为起点的子串. 假设i..j是以i开头的子串能匹配的最长的长度. (这个j可以给2. ...
- 【codeforces 793C】Mice problem
[题目链接]:http://codeforces.com/contest/793/problem/C [题意] 给你每个点x轴移动速度,y轴移动速度; 问你有没有某个时刻,所有的点都"严格& ...
- lucene_06_solr域
solr域在家目录下面\solr_home\collection1\conf中的schema.xml里面定义. 域必须要先在schema.xml下定义后才能使用. solr在操作Field域时需要在s ...
- [CSS3] :empty Selector
When the element has empty content, you might want to display some text to idicate the compoent is l ...
- luogu2261 [CQOI2007] 余数之和
题目大意 求 \[\sum_{i=1}^{n}(k\mod i)\] \(n,k\leq 10^9\). 题解 先只考虑\(n\leq k\)的情况. \[\sum_{i=1}^{n}(k\mod i ...