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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章