使用SWIG轻松编写Python扩展

这两天想办法用python链接动态库,实现动态加载。了解到有pyd这个概念,和dll差不多。如何生成pyd又如何调用这是两个问题。网上查资料,可以 使用boost python和swig python。前者试了很多办法,都没弄成。刚问同事可能是boost版本的问题,我用的是最新的,也想过可能是这个问题,只不过想尝鲜,结果差点搞崩 溃。后来用swig,这篇文章例子很简单。(*)为补充内容。

使用SWIG轻松编写Python扩展(http://hi.baidu.com/iceboy_/item/046139173f7db95b2b3e221b

偶然间翻Python文档时,发现提及一个叫SWIG的东西,上官网一看,是一个能解析C/C++代码并生成Perl/PHP/Python/TCL/Ruby等语言扩展的小工具。一时兴起在Windows环境下试验了一遍并记录。(* swig官网可以直接下载win下的exe文档,才用命令行的方式运行。)

首先创建foo.h和foo.c,分别声明和定义一个叫hello的函数:

foo.h:
extern void hello(void);

foo.c:
#include <stdio.h>

void hello(void)
{
    printf("Hello world!\n");
}

然后编写swig接口(interface)文件foo.i:(*这个.i类似于脚本说明,只针对swig运行程序,-自己理解)

%module swigtest
%include "foo.h"

接着,调用swig来生成wrapper,foo_wrap.c和swigtest.py:

swig -python foo.i

最后,使用VC的编译器进行编译:

cl /Fe_swigtest.pyd /LD foo.c foo_wrap.c c:\python27\libs\python27.lib /Ic:\python27\include(*这个字符串是在vs控制台下运行的指令。cl用命令行的方式编译c++文件。/Fe 生成文件名、 /LD 创建dll、/I 增加搜索路径。 )

将生成的swigtest.py和_swigtest.pyd复制到c:\python27\DLLs和c:\python27\Lib,即完成。(*python的默认搜索路径,也可以放在你的工程目录下。)

测试:

(*在控制台运行)

C:\Users\iceboy>python
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import swigtest
>>> swigtest.hello()
Hello world!

posted on 2014-04-15 10:18  haveGoodDay  阅读(380)  评论(0编辑  收藏  举报

导航