Python:使用SWIG编写C语言扩展

测试环境
ubuntu版本:ubuntu-gnome-16.04-desktop-amd64,gnome版
python版本:python3.5.2
------------------------------------------------------------------------

SWIG是一种软件开发工具。它能让一些脚本语言调用C/C++语言的接口。它实现的方法是,通过编译程序将C/C++的声明文件(.i文件)编译成C/C++的包装器源代码(.c或.cxx)。通过直接调用这样的包装器接口,脚本语言可以间接调用C/C++语言的程序接口。SWIG支持的语言有:Perl, Python, Tcl, Ruby, Guile, and Java。使用SWIG通常不需要修改被包装的源程序代码,并且只需要几分钟就能生成你所需要的包装器源代码文件。
SWIG是Python中调用C代码的另一种方法。在这个方法中,开发人员必须编写一个额外的接口文件来作为SWIG(终端工具)的入口。Python开发者一般不会采用这种方法,因为大多数情况它会带来不必要的复杂。而当你有一个C/C++代码库需要被多种语言调用时,这将是个非常不错的选择。

1. 安装SWIG
执行:sudo apt-get install swig

2. 准备测试代码
is_palindrome函数可以用于检测一个字符串是否是回文,如:
"abcba" 是回文
"abcb" 不是回文
palindrome.c
#include <string.h>
int is_palindrome(char *text) {
    int i, n = strlen(text);
    for (i = 0; i <= n/2; ++i) {
        if (text[i] != text[n-i-1]) 
        	return 0;
    }
    return 1;
}

3. 编写swig接口描述文件

palindrome.i

%module palindrome
%{
#include <string.h>
%}
extern int is_palindrome(char *text);
注:也可以尝试直接使用源代码的头文件

4. 运行SWIG
命令行下执行:swig -python palindrome.i
将生成两个文件,分别是palindrome.py和palindrome_wrap.c

5. 编译库
依次执行:
gcc -fPIC -c palindrome.c
gcc -I/usr/include/python3.5m -c -fPIC palindrome_wrap.c
gcc -shared -fPIC palindrome.o palindrome_wrap.o -o _palindrome.so
执行完后将生成_palindrome.so

6. 测试使用
执行python3进入解释器,执行下列操作:
>>> import _palindrome
>>> 
>>> _palindrome.is_palindrome('12321')
1
>>> 
>>> _palindrome.is_palindrome('1231')
0
>>> 



猜你喜欢

转载自blog.csdn.net/u012247418/article/details/80260728