您的位置:首页 > 编程语言 > C语言/C++

通过SWIG封装C/C++代码被Python调用

2014-02-28 13:45 519 查看
1.介绍

SWIG将C代码做成各种脚本语言的扩展模块(Python,Perl,Tcl等。SWIG本质上是一个编译器,它可以通过C/C++的头文件或者一个特殊的接口文件来生成一个以_wrapc为后缀的包装文件,例如你的C模块叫 test.c, 那么SWIG会为你生成一个test_wrapc文件,然后将这两个文件编译成一个动态链接库,就能使用其它的脚本语言来调用。

2.环境配置

python 2.7 + SWIG 2.0.12

3.Demo

1)下载并安装SWIG 2.0.12版本(http://swig.org/), Python 2.7 版本.

并将C:\swigwin-2.0.12, c:\Python27 添加到环境变量Path中。

2)代码:

foo.h:

extern void hello(void);

foo.c:

#include <stdio.h>

#include "foo.h"

void hello(void)

{

printf("Hello world!\n");

}

foo.i:

%module foo

%include "foo.h"

3)编译:

step 1: 调用swig生成wrapper, foo_wrap.c和foo.py(swig -python foo.i)

step 2: 使用vc的编译器进行编译目标文件。

打开VS -> Tools -> Visual Studio 2005 Command Prompt,定位到foo.c所在目录。

cl /Fe_foo.pyd /LD foo.c foo_wrap.c c:\Python27\libs\python27.lib /Ic:\Python27\include

生成的foo.py和_foo.pyd择其一即可正常调用。

step 3: 在当前目录下运行python命令行进行测试。

>> import foo

>> foo.hello()

4.注意事项

对于将要打包的C/C++代码,只有.h和.i文件时不够的,必须有.c/.cpp源代码,也就是说对于非自己生成的DLL库,是不能直接通过头文件生成.pyd库的。(但是我们可以加一层调用,这样的话就可以,但是通用性比较成问题,当外部DLL库导出符号发生变化的时候,中间层必须同时变化,维护是一场灾难。)

参见文章: /article/9943168.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: