SWIG是简单包装和接口生成器的缩写,它是一个能用于用于集中语言的工具。一方面,可以通过它使用C语言或者C++编写扩展代码;另一方面,它会自动包装那些代码,以便能在一些高级语言中使用,例如Tcl Python Perl Ruby java. 这就意味着如果决定将系统的一部分使用C语言扩展编写,而不是直接在Python中实现的话,那么C语言扩展库也能在其他语言中使用。当然需要一些不同语言编写的子系统协同工作时,这一点就非常有用。C语言扩展在协同工作时会变得很重要。
first step:
一个简单的C语言程序:
hello.c
#include <stdio.h>
#include <string.h>
int say_hello(void)
{
printf("Hello world!!");
return 0;
}
second step:
编写接口文件: 接口描述放到文件hello.i中。在很多情况下,如果定义了头文件,SWIG就可以从头文件中得到需要的信息。因此如果拥有一个头文件,可以随意的使用它。显示的描写一个接口文件是因为可以知道SWIG是怎么包装代码的。最重要的是排除一些东西。比如,如果你要包装一个巨大的C语音库,可能需要导出一些function到Python中。在这种情况下,只要把需要导出的函数放到接口文件中就可以了。
接口文件中,就像在一个头文件中那样,只需要声明要导出的函数和变量。头部的一个单元内,可以指定包含的头文件以及在这之前的一个%module声明,即为模块定义一个名字。
hello.i
%module hello
%{
#include<string.h>
#include<stdio.h>
%}
extern int say_hello(void);
third step:
输入:swig -python hello.i
得到两个新文件:hello_wrap.c 和hello.py
forth step: 编译、链接以及使用
编译可能是最有技巧的,为了正确的编译代码,需要知道python分布版的源代码放在哪。还要根据选择的C语言编译器,将代码链接到一个共享库,指明正确的选项。
我用的是Ubuntu 10.10的系统
eg.
gcc -c hello.c
gcc -I/usr/include/python2.6 -c hello_wrap.c #根据python不同的版本自己选择文件夹
gcc -shared hello.o hello_wrap.o -o _hello.so
然后打开python
>>> import _hello
>>> dir(_hello)
['SWIG_PyInstanceMethod_New', '__doc__', '__file__', '__name__', '__package__', 'say_hello']
>>>_hello.say_hello()
Hello World!!0
以上完毕。这个就是用SWIG来封装C语言。