python数组 swig_学习笔记:安装swig+用SWIG封装C++为Python模块+SWIG使用说明

这段时间一直在摸索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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值