这段时间一直在摸索swing,用它来封装C++代码来生成python脚步语言。并总结了swing从安装到配置再到代码封装编译生成动态库的整个过程,下面这篇文章都是我在实际的运用中的一些经验总结,分享给大家。
Python调用C/C++代码的利器除了boost_python外,还有SWIG(Simplified Wrapper and Interface Generator),它是用来为脚本语言调用C和C++程序的软件开发工具,它实际上是一个编译器,获取C/C++的声明和定义,用一个壳封装起来,以便其它脚本语言访问这些声明。所以,SWIG 最大的好处就是将脚本语言的开发效率和 C/C++ 的运行效率有机的结合起来。
前面的文章提到一个C++实现的双数组Trie Tree的实现:cedar,它在中文分词、新词发现等算法中的应用。本文以cedar的SWIG封装实现来说明SWIG的使用。
0. 安装swig
工欲善其事必先利其器,首先要安装swig,Ubuntu安装swig很简单:
sudo aptitude install swig
1. 声明和定义C/C++代码
在cedar的swig目录下面有cedar的C++声明和实现代码trie.h,但是这个实现里面没有遍历所有key的函数方法,所以我添加了一个实现,首先定义一个数据结构来定义key:
// key-value pair return type for next_key()
class kv_t {
public:
std::string key;
int value;
};
添加一个函数每次返回一个key,当key字符串为空时表示遍历结束,继续调用的话就又从头开始遍历:
// to iterate all keys
kv_t next_key() const {
static size_t from = 0, p = 0;
union { int i; int x; } b;
char key[256] = {0};
kv_t kv;
if(from == 0) {
b.i = _t->begin(from, p);
}else{
b.i = _t->next(from, p);
}
if (b.i == trie_t::CEDAR_NO_PATH) {
kv.key = "";
kv.value = 0;
from = 0;
p = 0;
return kv;
}
_t->suffix(key, p, from);
kv.key = key;
kv.value = b.x;
return kv;
}
2. 编写接口文件.i
查看cedar.i可以看到SWIG的接口文件的编写规则:
- 首先在 %module 后面声明模块名称,这就是Python在import时使用的模块名称;
- 在%{ … %}之间包含相关头文件
- 在%include 后面可以声明对STL的支持
- 最后声明要封装的函数和变量,也可以之间包含头文件: %include “trie.h”
3. 封装代码
可以在Makefile里面看到python-bindings:
python-bindings:
swig -Wall -python -builtin -outdir python -c++ cedar.i
mv -f cedar_wrap.cxx python
直接make或者单独运行上面的swig命令,就可以生成cedar.py和cedar_wrap.cxx文件。
4. 编译生成动态库
编译生成的cedar_wrap.cxx使用python distutils的setup,可以参考python/setup.py的编写。setup.py的build如下:
python setup.py build
就会在当前目录下面创建目录build,下面生成lib.linux-x86_64-2.7/cedar.py 和 _cedar.so
我的python学习笔记:www.yuanrenxue.com
学习笔记:安装swig+用SWIG封装C++为Python模块+SWIG使用说明的更多相关文章
-
SystemTap 学习笔记 - 安装篇
https://segmentfault.com/a/1190000000671438 在安装前,需要知道下自己的系统环境,我的环境如下: uname -r 2.6.18-308.el5 Linux ...
-
Directx11学习笔记【二十一】 封装键盘鼠标响应类
原文:Directx11学习笔记[二十一] 封装键盘鼠标响应类 摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/ ...
-
alfs学习笔记-安装和使用blfs工具
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一名linux爱好者,记录构建Beyond Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习 ...
-
python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化
1.双层装饰器 #!/usr/bin/env python # -*- coding: utf-8 -*- # author:zml LOGIN_INFO = False IS_ADMIN = Fal ...
-
iOS音频学习笔记一:常见音频封装格式及编码格式
(1) pcm格式 pcm是经过话筒录音后直接得到的未经压缩的数据流 数据大小=采样频率*采样位数*声道*秒数/8 采样频率一般是22k或者44k,位数一般是8位或者16位,声道一 ...
-
cocos2d-js 学习笔记 --安装调试(1)
目前从国内来看,比较知名的,适合前端程序员使用的游戏框架,基本是 egret 和cocos2d-js;刚好两个框架都学习了下, egret的是最近兴起的一个框架主要使用TypeScript.js语言做 ...
-
[TenserFlow学习笔记]——安装
最近人工智能.深度学习.机器学习等词汇很是热闹,所以想进一步学习一下.不一定吃这口饭,但多了解一下没有坏处.接下来将学习到的一些知识点做一下记录. 1.安装环境 在VMWare虚拟机中安装最新版本的U ...
-
elasticsearch学习笔记——安装,初步使用
前言 久仰elasticsearch大名,近年来,fackbook,baidu等大型网站的搜索功能均开始采用elasticsearch,足见其在处理大数据和高并发搜索中的卓越性能.不少其他网站也开始将 ...
-
Java 学习笔记 ------第五章 对象封装
本章学习目标: 了解封装的概念与实现 定义类.构造函数与方法 使用方法重载与不定长度自变量 了解static方法 一.Java封装概念 在面向对象程式设计方法中,封装(英语:Encapsulation ...
随机推荐
-
Unix 哲学
1.模块原则:使用简洁的接口拼接简单的部件 2.清晰原则:清晰胜于机巧 3.组合原则:设计时考虑拼接组合 4.分离原则:策略同机制分离,接口同引擎分离. 5.简洁原则:设计要简洁,复杂度能低则低 6. ...
-
Flex圆角矩形
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="h ...
-
解决NTPD漏洞,升级Ntpd版本
关于解决漏洞的问题我就不详说了,主要就是升级版本.这里我们就直接简单记录下步骤: 1.升级 使用root用户登录系统进入到/home/guankong ,上传ntp-4.2.8p9-1.el6.x86 ...
-
Bzoj3160:万径人踪灭
题面 Bzoj Sol 求不连续回文子序列的个数 \(ans=\)回文子序列个数-连续回文子序列个数 即回文子序列个数-回文子串个数 后面直接\(Manacher\)就好了 考虑前面的 枚举对称轴,设 ...
-
RxJS操作符(三)
一.过滤类操作符:debounce, debounceTime 跟时间相关的过滤 debounceTime自动完成:性能,避免每次请求都往出发 ); debounce中间传入Observable co ...
-
Exp2 后门原理与实践 20164320 王浩
一.实践基本内容 1.实践目标 (1)使用netcat获取主机操作Shell,cron启动 (2)使用socat获取主机操作Shell, 任务计划启动 (3)使用MSF meterpreter(或其他 ...
-
Linux第九周作业
学习笔记 不同类型的进程有不同的调度需求,其中分为两类 第一类:I/O-bound(频繁进行I/O,花费长时间等待I/O操作的完成)CPU-bound(计算密集型,需要大量的CPU时间进行运算) 第二 ...
-
VS2010安装msdn本地帮助
原文链接:http://www.2cto.com/kf/201210/162057.html 下面我们看看如何安装本地msdn技术帮助文档: 一.如何设置vs2010 按F1键时,打开的是本地文档(帮 ...
-
在myeclipse中换项目的jdk版本,你需要做哪些?
首先,我们必须把jdk在系统中安装好,环境变量配好,才能进行下一步的操作…… 然后在点击项目,右键选择Properties,找到Java Build Path,拉倒最下面,把原来的jdk版本给remo ...
-
cocos2d-X学习之主要类介绍:精灵角色(CCSprite)
CCSprite是一副2D图像,CCSprite可以通过图像或者图像中的一个矩形子区域创建 如果它的父节点或者任意继承树上的节点是CCspriteBatchNode则具有下述特性: 父节点是CCSpr ...