做Python开发,有时出于性能考虑或需要调用已有C/C++实现的东西时,我们就要使用Python的ctypes模块提供的CDLL方法或者自己编写扩展模块。
ctypes的CDLL方法对不含有C++类的dll或者so的访问还是比较方便靠谱的,但是对C++类方法的访问似乎不太好用。这时我们就需要自己编写扩展模块了。
编写扩展模块可以使用Python提供的API从0开始实现(比较累),也可以借助boost、swig或者sip等工具库来实现。知名度很高的PyQt4(Qt4的Python绑定)就是使用sip来完成的。
这里笔者以上一篇文章介绍的minimd5项目为例,记录使用swig创建Python扩展模块的方法,以便日后翻查。
以下步骤中所述源码,可在笔者上传到github上的minimd5项目中找到
首先安装swig和python开发环境,笔者在ubuntu下使用如下命令完成
1
sudo apt-get install swig python-dev
编写pyminimd5.c,实现函数: char md5sum(const char const file);
编写pyminimd5.i,该文件由swig加载生成pyminimd5_wrap.cxx文件,具体方法看下一步中的Makefile代码片段
1
2
3
4
5
6%module minimd5
%{
extern char *md5sum(const char *const file);
%}
extern char *md5sum(const char *const file);修改minimd5的Makfile,增加用于编译_minimd5.so的代码
1
2
3
4pyminimd5: $(PYMODULE_SOURCES)
swig -python -c++ pyminimd5.i
g++ -c pyminimd5.c pyminimd5_wrap.cxx md5.c -I/usr/include/python2.7/ -fPIC
g++ -shared pyminimd5.o pyminimd5_wrap.o md5.o -o $(PYMODULE_SO)make pyminimd5生成_minimd5.so,使用Python加载并测试