SWIG入门 1: 在python和c之间架起一座桥梁以及如何安装swig

1 SWIG是什么?
SWIG是一种软件开发工具。它能让一些脚本语言调用C/C++语言的接口。它实现的方法是,通过编译程序将C/C++的声明文件(.i文件)编译成C/C++的包装器源代码(.c或.cxx)。通过直接调用这样的包装器接口,脚本语言可以间接调用C/C++语言的程序接口。SWIG支持的语言有:Perl, Python, Tcl, Ruby, Guile, and Java。使用SWIG通常不需要修改被包装的源程序代码,并且只需要几分钟就能生成你所需要的包装器源代码文件。SWIG使用的场景包括:
1 将C语言的程序包装成解释性语言的接口。
2 快速原型开发
3 可交互式的DEBUG
4 将代码重构成脚本语言

等等

 

2 如何安装swig。

在linux下安装非常简单。最常见的就是通过源码安装。源码大家可以在http://www.swig.org/download.html上下载。然后就是安装的老三步:configure;make;make install

也可以在有apt系统上通过apt工具安装。

比如在我用的debian6(squeeze)上,直接用apt工具:

aptitute install swig


3 一个简单的SWIG的例子

假如你有这样一段C的代码,文件名为example.c

/* File : example.c */

double  My_variable  = 3.0;

/* Compute factorial of n */
int  fact(int n) {
	if (n <= 1) return 1;
	else return n*fact(n-1);
}

/* Compute n mod m */
int my_mod(int n, int m) {
	return(n % m);
}

你想在你的脚本语言的代码里面调用fact函数。你可以通过一段非常简单的SWIG脚本,文件名为example.i:

/* File : example.i */
%module example
%{
/* Put headers and other declarations here */
extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);
%}

extern double My_variable;
extern int    fact(int);
extern int    my_mod(int n, int m);

这段.i文件分成3个部分:

第一部分是 %module example, %module是SWIG脚本的一个命令,它表示生成的包装器将在一个模块内的名称。

第二部分是%{... %},这一部分的内容会原封不动的插入到 xxxx_wrap.c或 xxxx_wrap.cxx文件中。

第三部分就是剩下的部分了。这部分就是C语言或者C++语言的接口声明了。和C/C++的语法是一样的。

 

然后在安装了swig的机器上执行下面的命令。我以linux操作系统下,为python语言生成接口为例:

swig -python example.i
gcc -c -fpic example.c example_wrap.c -I/usr/local/include/python2.0
gcc -shared example.o example_wrap.o -o _example.so


在执行完第一步swig之后,实际上会生成两个文件example.py和example_wrap.c。 example.py就是python语言可以调用的example模块,而example_wrap.c则封装了example.c的封装器。

在这之后你就可以直接在python里直接调用example.c提供的接口了:

unix > python
Python 2.0 (#6, Feb 21 2001, 13:29:45)
[GCC egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)] on linux2
Type "copyright", "credits" or "license" for more information.     
>>> import example
>>> example.fact(4)
24
>>> example.my_mod(23,7)
2
>>> example.cvar.My_variable + 4.5
7.5


 

 总之,安装和使用swig都是非常简单的事情。使用swig能够大大减轻程序员的痛苦程度,帮助你更快的完成你想要的功能。

你可以在此处下载本文的例子:https://dl.dropbox.com/u/35106490/swig1.tgz


你可能感兴趣的:(python,swig,Pythonic)