β

高效开发Python扩展模块方法:用SWIG封装C/C++代码

atolin 135 阅读

1. SWIG介绍:

http://sourceforge.net/projects/swig/

2. 对于性能有追求的功能模块(这并不意味着python性能低),自然需要考虑用C/C++扩展python模块;

方法其实有两种:

一是遵从python扩展模块API规范,用C/C++直接写python模块;
此方法开发出来的扩展模块(DLL动态库),可看做原生的python模块,
不需要依赖其他第三方库;缺点是,开发需要写大量的规范的C/C++到Python的转换代码
(这部分代码按照规范写就可以,算是体力劳动);

一是使用SWIG工具,这样,开发高性能的C/C++代码后,不用再手工写从C/C++到python的转换代码,
这个工作SWIG帮你做了。可谓十分方便,所谓高手,也就是能熟练使用各种工具及原理,
并运用的实际设计中。呵呵,下面就这种方法,做一个简单介绍:

3. 使用SWIG包裹C/C++代码生成python扩展模块步骤

3.1 写SWIG的接口文件(.i),见下面例子:

%module tmc
%{
#include “PreProcessTMC.h”
%}
%include /* 若需要stl的string类或方法,需要包含此文件 */
%include /* 若需要C++类或方法导出符号,需要包含此文件 */
%include “PreProcessTMC.h”

3.2 使用SWIG自动生成包裹类(即C/C++到python的转换代码)
E:\code\swigwin-2.0.9>swig.exe -c++ -python E:\2013\01\2013-01-16\CalcMesh\TMC\TMC.i

3.3 python扩展模块编译安装
准备setup.py脚本如下:

from distutils.core import setup, Extension

ext_module = Extension(‘_tmc’,
include_dirs = [r'..\..\..\..\..\code\gdal\ogr\ogrsf_frmts\shape'],
define_macros = [('TMC_EXPORTS', '1')],
libraries = ['LibPort', 'LibShape'],
library_dirs = [r'..\Test\Release'],
sources = ['TMC_wrap.cxx', 'PreProcessTMC.cpp'],
)

setup(name=’tmc’,
version=’1.0.0′,
description = ‘This is a demo package’,
ext_modules = [ext_module],
py_modules = ['tmc'],
)

注意Extension里面的模块name为_tmc(需要加下划线前缀,否则会出现链接错误)

3.4 python setup.py build

enjoy it.

作者:atolin
准完美主义软件社稷师
原文地址:高效开发Python扩展模块方法:用SWIG封装C/C++代码, 感谢原作者分享。

发表评论