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

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

2013-02-19 17:30 375 查看
原文首发地址: http://www.atolin.net/298/

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: