python 中用SWIG包装C和C++和接口生成的例子

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语言。

posted @ 2011-08-26 11:25  Rabbit Nick  阅读(836)  评论(0编辑  收藏  举报