Python SIP使用总结(Win&Linux通用)
本帖最后由 sunny2038 于 2012-03-24 22:53:01 编辑 本文原先发表与我的博客。这是我做图像处理的时候摸索到的,现分享给大家。在用Python+OpenCV做影像分割、识别以及变换检测时,有时候会遇到处理速度瓶颈,于是想到用C++重写一些模块。在观察各个Python调用C++的方法中,在网上看了许多评价和介绍,最后选择了SIP作为工具。
本着分享的精神,现将使用的方法和在使用中遇到的问题总结出来,供大家参考。欢迎拍砖。本文也参加CSDN技术大分享活动,欢迎大家捧场。
如前所述,Python中使用C/C++模块有许多工具,大名鼎鼎的有SWIG(英文意思为:豪饮)、SIP(英文意思为:啜饮,小口的喝),还有boost.python等。其中SIP是从SWIG发展而来,专为Python调用C/C++模块使用的(看SIP的命名就能看出来,很有意思的)。
或许有人问为什么不用ctypes模块,原因是使用SIP无需编写特定格式的C/C++文件。需要调用的C/C++源代码文件,只是最简单的函数即可。若说SIP有什么需要学习的,那就是sip文件(下文中会介绍到)的编写。不过sip文件是基于C/C++的头文件的,学起来也比较简单。
SIP的使用方法,在官网的SIP Reference Guide中有介绍,不过那是针对至少有点经验的人员,对初学者来说,想十分钟快速上手还是有点难度的。这里就介绍下本人在使用SIP总结的需要注意的地方。
前提:本机上要装了Python、GCC(Windows下可以用MinGW)。并把python.exe和MinGW下的bin文件路径添加到环境变量中。
第一部分:安装SIP
Windows:
将Riverbank上的sip的zip格式的代码包下载,将其解压到C:\Python27中,那么现在sip的文件夹路径为C:\Python27\sip-4.13.2\sip-4.13.2(你也可以将其解压到任何一个文件夹中,但这里为了叙述方便,就解压到我电脑上的Python的文件夹中)。
打开Windows的cmd命令行,输如cd C:\Python27\sip-4.13.2\sip-4.13.2跳转到sip文件夹下。
输入python configure.py --platform win32-g++。进行配置
再完成上一步后,输入mingw32-make,接着输入mingw32-make install。若无意外,SIP就安装完成了。
常见问题:
若是你的电脑上之前安装了Eclipse等其他软件,而将mingw32-make改成了make,那么就要将上面的mingw32-make命令改为make来使用。
有个朋友说他按上面的方法使用make总是报错,仔细一问,才发现他的电脑上安装了Embacardero的RAD开发工具,也就是熟知的Delphi和C++ Builder的开发工具。在安装了这个工具后,在命令行中输入make,使用的总是Embacardero的C++ Builder的make。根据亲测,即使在配置的时候,使用python configure.py --platform win32-borland命令进行配置,对Emcarbadero的make也是无效的。这个配置命令产生的make文件,只是用于老版本的Borland C++ Builder的make命令。
若要使用微软的VC的nmake,就要在配置时使用命令python configure.py --platform win32-msvc,其中win32-msvc使用的是VC6的nmake;win32-msvc.net使用的是VC2003的nmake;win32-msvc2005使用的是VC2005的nmake;win32-msvc2008使用的是VC2008的nmake。根据--show-platforms命令显示的结果,SIP的配置暂不支持VC2010和VS11下的nmake。若想知道SIP支持的所有平台和编译器,可以在命令行中使用python configure.py --show -platforms命令来查看。
Linux:
Linux下的SIP安装与之类似,甚至更简单,Linux的发行版如Ubuntu,都自动安装了python和gcc,无需配置环境变量。
所以只要在官网上下载SIP的Linux下的tar.gz格式的代码包,解压到某个目录中。然后在终端中进入该目录,依次输入python configure.py --platform linux-g++;make;make install即可。
第二部分:在Python中使用C/C++写的函数
1、首先,编写个C文件,功能是将两个数字相加并输出,命名为add.c,这个将成为在Python中的模块名,如下:
/* File : add.c */
int add(int x, int y)
{
int g;
g = x + y;
return g;
}
/* Define the SIP wrapper to the add library. */
%Module(name=add, language="C")
int add(int x, int y);
%TypeHeaderCode
#include <word.h>
%End
3、编译C文件。按照官网的说法,是编写configure.py,但别急,先做一些必不可少的工作。在命令行将add.c编译成add.o文件:输入
gcc -c add.c
接着,将这一步生成的add.o文件生产库文件:
ar -r libadd.a add.o
这两步在这里是为一个单独的C模块测试的,如果是大量的C模块,可以用一个makefile一并批量完成,这也是初学者容易模糊的地方。记住,需要将libadd.a文件复制到Python文件夹下的libs文件夹中。也可以将源代码直接编译成dll,命令为gcc --shared add.c -o add.dll,记住要将生成的dll放到python\LIB\site-packages文件夹下。
4、手工编写configure.py文件,同样,这个configure文件的编写也不难,看下规范就会了(要会鸟语。。。)。这里,我们模仿官网的模版写一个自己的configure.py。
import os
import sipconfig
# The name of the SIP build file generated by SIP and used by the build
# system.
build_file = "add.sbf"
# Get the SIP configuration information.
config = sipconfig.Configuration()
# Run SIP to generate the code.
os.system(" ".join([config.sip_bin, "-c", ".", "-b", build_file, "add.sip"]))
# Create the Makefile.
makefile = sipconfig.SIPModuleMakefile(config, build_file)
# Add the library we are wrapping. The name doesn't include any platform
# specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the
# ".dll" extension on Windows).
makefile.extra_libs = ["add"]
# Generate the Makefile itself.
makefile.generate()
>>>import add
>>>add.add(4, 7)
11
>>>