版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使用Swig封装C+到Python的心得-01 收藏 一简述 前一段时间由于工作需要重点学习了一下用Swig来封装C+代码到Python的知识,期间遇到一些问题,也有一些心得体会,特此记录。 本文只涉及封装C+到Python,其他诸如封装到Java等没有涉及。 假设读者对Python和C+这两种语言都有一定的了解,到底要什么程度,我也说不清。 本文的所有知识均来自于Swig的帮助文档SWIGDocumentation.pdf和我的实践,不一定完全正确。二环境搭建 我不想忽略细节,所以我尽量详细,。 我下载swigwin-1.3.33.zip,在H:3rdTools目录下直接解压缩,即把swig
2、安装到H:3rdToolsswigwin-1.3.33目录中,将H:3rdToolsswigwin-1.3.33加入VC的可执行文件路径。 我使用的是Visual Studio 2005, 我下载python-2.4.4.msi,安装到H:3rdToolsPython24目录,并在PATH环境变量中加入H:3rdToolsPython24,将H:3rdToolsPython24include加入VC的Include路径,将H:3rdToolsPython24libs加入VC的Library路径。三简单例子 让我们从一个Helloworld的例子入手,在Windows上制作一个DLL库,并将其封
3、装成Python的一个Module,然后在Python中import这个Module,调用其中提供的函数,从而显示出“HelloWorld!”。 新建一个Win32 Console Application,注意在Application Settings中选择DLL以及空项目。完成后将工程的配置改成release(主要是因为我用的Python库是Release版的,而非Debug版的)。 具体工程参见practise_swigHelloWorld,首先向工程里添加HelloWorld.hpp和HelloWorld.cpp文件,里面的内容就是基本的HelloWorld函数。 接下来的工作就是要把这
4、个函数进行封装,使得我们能够在Python中使用该函数。用C+来扩展Python时常用的方式是制作一个动态库,在其中按照Python的规定(详见Python的帮助)来定义一些函数(其形式往往是这样的PyObject * wrap_HelloWorld (PyObject *self, PyObject *args)),这种函数的内容主要是把从Python来的输入参数(由PyObject *args所指),变换成普通的C+类型,然后调用需要封装的C+函数(上文在HelloWorld.cpp中定义的HelloWorld函数就是一个简单的例子)对这些输入进行处理,再把得到的返回值转换成对应的Pyth
5、on的数据类型,最后返回到Python中去。在一定程度上,只要内部具体负责数据处理的函数的输入输出形式确定之后,外层的封装函数的形式也就确定了(当然,封装形式可能不只一种)。当然撰写外层封装函数的工作可以由人来完成,但最好的方法是由机器来生成,Swig就是这样一种机器了。只要告知其我们要封装什么,它就可以帮我们生成封装函数的代码。只要把这些代码和我们自己的代码放在一起,编译成一个动态库,然后就可以在Python中使用我们自己的函数了。 从而所有关于如何使用Swig的重点都转移到如何告知Swig我们要封装什么,以及如何使用Swig封装出的接口上来了。 我们通过一个文本文件(该文件通常以.i为扩展
6、名)来告知Swig我们需要其封装什么东西。下面是HelloWorld工程里的HelloWorld.i文件。%module HelloWorld%header %#include HelloWorld.hpp% int HelloWorld(int iDate);通过如下命令行,控制Swig对该文件进行处理。swig -c+ -python -o HelloWorld_wrapper.cpp HelloWorld.i处理的结果是生成两个新的文件,一个是HelloWorld.py,一个是HelloWorld_wrapper.cpp。在Python中使用import HelloWorld,就会去加载
7、HelloWorld.py文件,而HelloWorld.py文件的第一句就是import _HelloWorld。_HelloWorld是什么,它是一个需要我们来制作的动态库,即我们要把Swig生成的HelloWorld_wrapper.cpp和我们自己写的HelloWorld.hpp、HelloWorld.cpp文件放在一起制作出一个名为_HelloWorld.dll的动态库来。Swig生成的文件的名字和内容由HelloWorld.i文件的内容以及swig执行的命令行参数的共同决定。先来说说命令行参数“-c+”表示要封装C+代码(不写默认是封装C代码),“-python”表示要封装成Pyth
8、on接口(Swig还可以封装成Java、Ruby等接口),“HelloWorld_wrapper.cpp”表示指定要生成的C+代码文件的名字。HelloWorld.i文件分为3个部分,首先是%module HelloWorld表示要生成的Module的名字是HelloWorld(即要生成HelloWorld.py文件)。 然后是%header %#include HelloWorld.hpp%凡是出现在%header%对中的内容都会原封不动的出现在HelloWorld_wrapper.cpp文件的头部位置。最后是int HelloWorld(int iDate);指明我们要封装的C+函数。这里
9、我们再详细描述一下使用VC2005制作_HelloWorld的过程:1. 新建一个Win32 Console Application,要是空的DLL工程,工程配置使用release;2. 添加HelloWorld.hpp、HelloWorld.cpp两个文件到工程;3. 在工程中新建HelloWorld.i文件,内容见上文;4. 修改HelloWorld.i的属性,使用自定义编译工具(Custom Build Tool),命令行(Command Line)内容为swig -c+ -python -o $(InputName)_wrapper.cpp $(InputPath),输出(Output
10、s)为$(InputName)_wrapper.cpp;5. 编译HelloWorld.i文件,将新生成的HelloWorld_wrapper.cpp文件加入工程;6. 修改工程的配置属性(Configuration Properties),包括LinkerGeneralOutput File改成$(OutDir)_HelloWorld.dllBuild EventsPost-Build EventCommand Line改成echo copy $(InputDir)HelloWorld.py $(TargetDir)copy $(InputDir)HelloWorld.py $(Target
11、Dir)还有一些配置在VC2005里是默认的,但在VC2003里不是的,请引起注意,包括1. C/C+Code GenerationRuntime Library要选择Multi-threaded DLL (/MD)2. C/C+LanguageTreat wchar_t as Built-in Type要选择yes(如果转换不涉及wchar等,则无需处理这一项)3. C/C+LanguageEnable Run-Time Type Info要选择yes(这个和Swig无关,但有时有些编译问题就是由于这个选项造成的,譬如使用TAO中的any,当然这是题外话了,读者可以忽略) 一旦_HelloW
12、orld.dll制作完成后,就可以在Python中使用了。大致用法如下(_HelloWorld.dll和HelloWorld.py文件都已在practise_swigrelease目录中):在cmd窗口,进入practise_swigrelease目录,运行Python,进入交互式界面:H:WORKSPACErenStudyswigpractise_swigreleasepythonPython 2.4.4 (#71, Oct 18 2006, 08:34:43) MSC v.1310 32 bit (Intel) on win32Type help, copyright, credits o
13、r license for more information. import HelloWorld dir(HelloWorld)HelloWorld, _HelloWorld, _builtins_, _doc_, _file_, _name_, _newclass, _object, _swig_getattr, _swig_property, _swig_repr, _swig_setattr, _swig_setattr_nondynamic, new, new_instancemethod ret = HelloWorld.HelloWorld(7)Hello World, Sund
14、ay! print ret7 非常好用吧。 题外话:关于Python的库链接的问题。1. 在工程的属性设置里并没有指明要链接python24.lib,只是在整个VC的Library路径中有python24.lib所在的路径。这是怎么回事呢?注意pyconfig.h文件中的如下内容/* For an MSVC DLL, we can nominate the .lib files used by extensions */#ifdef MS_COREDLL# ifndef Py_BUILD_CORE /* not building the core - must be an ext */# if
15、 defined(_MSC_VER) /* So MSVC users need not specify the .lib file in their Makefile (other compilers are generally taken care of by distutils.) */# ifdef _DEBUG# pragma comment(lib,python24_d.lib)# else# pragma comment(lib,python24.lib)# endif /* _DEBUG */# endif /* _MSC_VER */# endif /* Py_BUILD_C
16、ORE */#endif /* MS_COREDLL */凡是include了Python.h(其中又include了pyconfig.h)的文件在编译完成后的链接过程中都会去链接pragma comment(lib,python24.lib)所指定的库。2. 在运行时Python是需要python24.dll这个库文件的,但Python的安装目录里没有这个文件,其实在Python的安装过程中,其被拷贝到了C:WINDOWSsystem32目录里。抱歉我太啰嗦了(生怕漏了什么,以后自己也忘记了),让大家见笑了。 顺便问一下,怎么贴附件呢?我想把VC的工程打包后贴进来,可行吗?本文来自CSDN博
17、客,转载请标明出处:/alexdboy/archive/2008/04/25/.aspx用Swig封装C/C+来源:网络 |时间:2010-01-12 | 点击: 96次这段时间在摸swig,用它来封装一些后台c+代码,分别生成其他脚本语言(java、python等)可用的api,并总结了swig从安装到配置到生成api的过程,里面也融进了一些网上的资料,还有我自己在实际应用中的感触,留个脚印。 一 SWIG简介: SWIG是Simple Wrapper and Interface Generator的缩写,是一个帮助使用C或者C+编写的软件创建其他编语言
18、的API的工具。例如,我想要为一个C+编写的程序创建.NET API,一般情况下我必须使用托管C+(Managed C+)去编写大量的代码才能生成它的.NET API。有了SWIG,这个机械的工作将变得非常简单。你只须要使用一个接口文件告诉SWIG要为那些类创建.NET API,SWIG就会自动帮你生成它的.NET API。 当然,SWIG不仅仅支持创建.NET API。最新版本的SWIG支持常用脚本语言Perl、PHP、Python、Tcl、Ruby和非脚本语言C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, O
19、CAML以及R,甚至是编译器或者汇编的计划应用(Guile, MzScheme, Chicken)。 二 环境搭建 1. 下载swigwin,在E:/lib目录下解压,即把swig安装到E:/lib/swig目录中。 2. 新建一个Win32 Console Application,注意在Application Settings中选择DLL以及空项目。完成后将工程的配置改成release 3. 工具- 选项- 项目和解决方案- VC+目录- 添加E:libswigwin。即把swig添加到VC的可执行目录。 -若封装成Python可用的API,执行如下步骤- 4. 下载python2.5,安装
20、到D:/Program Files目录,并在环境变量PATH中加入D:/Program Files/python2.5。 5. 把D:/Program Files/python2.5/include加入VC的Include路径,将D:/Program Files/python2.5/libs加入VC的Library路径。 -若封装成Java可用的API,执行如下步骤- 6. 下载JDK,安装到D:/Program Files目录,并在环境变量PATH中加入D:Program FilesJavajdk1.6.0_10bin(如果之前安装过Oracle,要将D:Program FilesJavaj
21、dk1.6.0_10bin放在Oraclejre1.3.1bin前面,否则在编译的时候默认会选择oracle的jdk) 7. 把D:Program FilesJavajdk1.6.0_10includewin32 和D:Program FilesJavajdk1.6.0_10include 加入到加入VC的Include路径。 三 接口文件 要在C/C+工程中创建*.i 的接口文件,告诉SWIG要为那些类的那些方法创建API。 接口文件注解: 1. 模块名由指定的%module来给出(或者用-module命令行选项).这段指示性文字必须写在文件的头部并且在使用时将这个模块名作为扩展模块对象来使
22、用(此外,这个模块名经常在目标语言中被定义成一个命名空间来使用)。如果模块名在命令行已经被给出了,系统将不考虑由%module标示的模块名了。 对于python:module的名字指定了生成文件xxx.py的xxx名字, 对于java:module的名字指定了生成文件xxx.java的xxx名字 2. 所有在%.%块内的东西将被简单作为结果逐字拷贝到SWIG创建的wrapper(包装)文件中。这部分大部分被用来包括头文件和生成wrapper代码需要的其它声明。这里很重要的强调一点因为你在一个SWIG的输入文件中包含了一个声明,这个声明并不自动显示在生成的wrapper代码中,因此你需要确信你确
23、实把正确的头文件在% . %部分中。这里应该指出SWIG不解析和解释附在% . %部分的文字。SWIG的%.%内的语法和语义很类似于输入文件中的声明部分。 3. 如果打算为类中所有方法创建API,那么有一个非常简单的办法,在接口文件的类声明部分使用%include标记。SWIG将对%include所指定的文件进行语法分析,类中所有公有方法(Public Method)都将在API中暴露。 /* SwigTest.i */ %module SwigTest % #include SwigTest.h % %include SwigTest.h /不要和#用混 - swig库模块访问部分标准C+库
24、包括STL的方法- SWIG对于一些语言模块的支持使较全面的但是对很少用到的库则支持的很少。 下面就是表示了C+类和支持的C+库以及SWIG接口文件的对应表 C+ class C+ Library file SWIG Interface library file std:deque deque std_deque.i std:list list std_list.i std:map map std_map.i std:pair utility std_pair.i std:set set std_set.i std:string string std_string.i Swig使用教程(在VS2010上使用swig)1. 首先下载swig并解压,即相当于安装成功。2. 下载python安装上3. 打开VS2010新建工程,选择DLL选项,并选择空的工程4. 添加自己想要封装的.h和.cpp文件分别在header和soursefile里面是自己想要的c+代码5. 在工程上添加.i文件和头文件和源文件是同一目录下6. 然后设置.i的属性set ItemType as Custom bu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水暖产业链协同发展-洞察分析
- 网络功能虚拟化性能优化-洞察分析
- 网络边缘安全密码算法-洞察分析
- 农村大病低保户申请书范文(6篇)
- 2025合同诉讼有效期范文
- 2025物流合同样本
- 全球宏观经济形势深度分析与行业预测报告
- 清汁笋项目可行性研究报告
- 断路器塑壳项目可行性研究报告
- 2025年中国停车牌市场深度调研分析及投资前景研究预测报告
- 华南农业大学农学院生物技术复习题附答案
- 乐高——人形机器人搭建(图2)
- 内螺纹铜管成型技术与工艺(综述)
- 年消化10万吨荔枝产荔枝酒的可行性研究报告
- 群塔作业方案(图文并茂,十分详细)
- 花城三年级音乐乐理知识总结(共5页)
- 通风空调工程系统调试验收记录(送、排风系统)
- 纸箱跌落实验报告(共2页)
- 绿色环保引领企业申请表(模板)
- 布洛芬工艺规程
- 【设计管理】设计单位履约评价表(规划、概念及方案设计)
评论
0/150
提交评论