Python SIP使用总结(WinLinux通用)
From: http://topic.csdn.net/u/20120324/22/cd8796f8-c601-492c-992d-3d70d58ba51b.html?07033688857013248#replyachor
本文原先發(fā)表與我的博客。這是我做圖像處理的時(shí)候摸索到的,現(xiàn)分享給大家。在用Python+OpenCV做影像分割、識(shí)別以及變換檢測(cè)時(shí),有時(shí)候會(huì)遇到處理速度瓶頸,于是想到用C++重寫(xiě)一些模塊。在觀察各個(gè)Python調(diào)用C++的方法中,在網(wǎng)上看了許多評(píng)價(jià)和介紹,最后選擇了SIP作為工具。
? 本著分享的精神,現(xiàn)將使用的方法和在使用中遇到的問(wèn)題總結(jié)出來(lái),供大家參考。歡迎拍磚。本文也參加CSDN技術(shù)大分享活動(dòng),歡迎大家捧場(chǎng)。
? 如前所述,Python中使用C/C++模塊有許多工具,大名鼎鼎的有SWIG(英文意思為:豪飲)、SIP(英文意思為:啜飲,小口的喝),還有boost.python等。其中SIP是從SWIG發(fā)展而來(lái),專為Python調(diào)用C/C++模塊使用的(看SIP的命名就能看出來(lái),很有意思的)。
? 或許有人問(wèn)為什么不用ctypes模塊,原因是使用SIP無(wú)需編寫(xiě)特定格式的C/C++文件。需要調(diào)用的C/C++源代碼文件,只是最簡(jiǎn)單的函數(shù)即可。若說(shuō)SIP有什么需要學(xué)習(xí)的,那就是sip文件(下文中會(huì)介紹到)的編寫(xiě)。不過(guò)sip文件是基于C/C++的頭文件的,學(xué)起來(lái)也比較簡(jiǎn)單。
? SIP的使用方法,在官網(wǎng)的SIP Reference Guide中有介紹,不過(guò)那是針對(duì)至少有點(diǎn)經(jīng)驗(yàn)的人員,對(duì)初學(xué)者來(lái)說(shuō),想十分鐘快速上手還是有點(diǎn)難度的。這里就介紹下本人在使用SIP總結(jié)的需要注意的地方。
??前提:本機(jī)上要裝了Python、GCC(Windows下可以用MinGW)。并把python.exe和MinGW下的bin文件路徑添加到環(huán)境變量中。
第一部分:安裝SIP
??Windows:
? 將Riverbank上的sip的zip格式的代碼包下載,將其解壓到C:\Python27中,那么現(xiàn)在sip的文件夾路徑為C:\Python27\sip-4.13.2\sip-4.13.2(你也可以將其解壓到任何一個(gè)文件夾中,但這里為了敘述方便,就解壓到我電腦上的Python的文件夾中)。
? 打開(kāi)Windows的cmd命令行,輸如cd C:\Python27\sip-4.13.2\sip-4.13.2跳轉(zhuǎn)到sip文件夾下。
? 輸入python configure.py --platform win32-g++。進(jìn)行配置
? 再完成上一步后,輸入mingw32-make,接著輸入mingw32-make install。若無(wú)意外,SIP就安裝完成了。
??常見(jiàn)問(wèn)題:
? 若是你的電腦上之前安裝了Eclipse等其他軟件,而將mingw32-make改成了make,那么就要將上面的mingw32-make命令改為make來(lái)使用。
? 有個(gè)朋友說(shuō)他按上面的方法使用make總是報(bào)錯(cuò),仔細(xì)一問(wèn),才發(fā)現(xiàn)他的電腦上安裝了Embacardero的RAD開(kāi)發(fā)工具,也就是熟知的Delphi和C++ Builder的開(kāi)發(fā)工具。在安裝了這個(gè)工具后,在命令行中輸入make,使用的總是Embacardero的C++ Builder的make。根據(jù)親測(cè),即使在配置的時(shí)候,使用python configure.py --platform win32-borland命令進(jìn)行配置,對(duì)Emcarbadero的make也是無(wú)效的。這個(gè)配置命令產(chǎn)生的make文件,只是用于老版本的Borland C++ Builder的make命令。
? 若要使用微軟的VC的nmake,就要在配置時(shí)使用命令python configure.py --platform win32-msvc,其中win32-msvc使用的是VC6的nmake;win32-msvc.net使用的是VC2003的nmake;win32-msvc2005使用的是VC2005的nmake;win32-msvc2008使用的是VC2008的nmake。根據(jù)--show-platforms命令顯示的結(jié)果,SIP的配置暫不支持VC2010和VS11下的nmake。若想知道SIP支持的所有平臺(tái)和編譯器,可以在命令行中使用python configure.py --show -platforms命令來(lái)查看。
??Linux:
? Linux下的SIP安裝與之類似,甚至更簡(jiǎn)單,Linux的發(fā)行版如Ubuntu,都自動(dòng)安裝了python和gcc,無(wú)需配置環(huán)境變量。
? 所以只要在官網(wǎng)上下載SIP的Linux下的tar.gz格式的代碼包,解壓到某個(gè)目錄中。然后在終端中進(jìn)入該目錄,依次輸入python configure.py --platform linux-g++;make;make install即可。
第二部分:在Python中使用C/C++寫(xiě)的函數(shù)
??1、首先,編寫(xiě)個(gè)C文件,功能是將兩個(gè)數(shù)字相加并輸出,命名為add.c,這個(gè)將成為在Python中的模塊名,如下:
?? 2、接著 ,手工編寫(xiě)SIP文件,在使用SIP的過(guò)程中,一個(gè)C/C++的源碼文件,必須對(duì)應(yīng)一個(gè)同名的sip文件,命名為add.sip,如下:
C/C++ code
? 如果是源程序是用C++寫(xiě)的,那么這里的(name=add, language="C")就可以省去。
? 這里的C源碼文件沒(méi)有頭文件,所以對(duì)應(yīng)的sip文件很簡(jiǎn)單。如果C/C++的源碼是實(shí)現(xiàn)部分,在實(shí)現(xiàn)部分還包括接口部分,即頭文件。那么在相應(yīng)的sip文件中需要用
C/C++ code
? 來(lái)包含相應(yīng)的頭文件。sip文件與正式的C/C++頭文件相似,但與之不同的是:sip文件不包含相應(yīng)的頭文件的私有成員變量(private或protected)。更詳細(xì)的sip文件編寫(xiě)規(guī)范,請(qǐng)參考riverbank官方網(wǎng)站上的說(shuō)明文檔SIP Reference Guide。
?? 3、編譯C文件 。按照官網(wǎng)的說(shuō)法,是編寫(xiě)configure.py,但別急,先做一些必不可少的工作。在命令行將add.c編譯成add.o文件:輸入
gcc -c add.c
接著,將這一步生成的add.o文件生產(chǎn)庫(kù)文件:
ar -r libadd.a add.o
? 這兩步在這里是為一個(gè)單獨(dú)的C模塊測(cè)試的,如果是大量的C模塊,可以用一個(gè)makefile一并批量完成,這也是初學(xué)者容易模糊的地方。 記住,需要將libadd.a文件復(fù)制到Python文件夾下的libs文件夾中。 也可以將源代碼直接編譯成dll,命令為gcc --shared add.c -o add.dll, 記住要將生成的dll放到python\LIB\site-packages文件夾下。
?? 4、手工編寫(xiě)configure.py文件 ,同樣,這個(gè)configure文件的編寫(xiě)也不難,看下規(guī)范就會(huì)了(要會(huì)鳥(niǎo)語(yǔ)。。。)。這里,我們模仿官網(wǎng)的模版寫(xiě)一個(gè)自己的configure.py。
Python code
?? 5、運(yùn)行configure.py ,會(huì)生成一個(gè)makefile文件(直接用IDLE打開(kāi)configure.py,按F5運(yùn)行;或者命令行用python configure.py運(yùn)行都可以)。
這里有個(gè)詭異的地方,有幾個(gè)朋友在這一步會(huì)報(bào)錯(cuò),說(shuō)找不到add.sbf文件,而add.sbf文件應(yīng)該是configure.py運(yùn)行時(shí)調(diào)用相關(guān)函數(shù)自動(dòng)產(chǎn)生的。若出現(xiàn)這個(gè)問(wèn)題,請(qǐng)重新編譯SIP。如果是Windows下,最好是在另一臺(tái)機(jī)器上拷貝一個(gè)完整的包含能正常的SIP的Python文件夾,到有問(wèn)題的機(jī)器上,將問(wèn)題Python文件夾覆蓋掉。
?? 6、在命令行輸入make (這里會(huì)生成一個(gè)關(guān)于函數(shù)的警告,不用管它,我們是用來(lái)測(cè)試的。。。其他的應(yīng)該沒(méi)什么問(wèn)題,若有問(wèn)題請(qǐng)檢查前面的步驟),生成add.pyd文件。然后再輸入make install(將add.pyd文件裝入到Python的Lib文件夾下的sit-packages文件夾中)。
?? 7、打開(kāi)Python 的命令行,進(jìn)行測(cè)試 :
Python code
(原諒我這么爛的模塊名。。。)
提示:
(1)、這些文件可以放到Python的文件夾下新建的文件夾中(所有的操作在這個(gè)目錄下的命令行窗口中使用)。注意,Python的父文件夾名不能有空格,否則會(huì)無(wú)法讀取庫(kù)文件。
總結(jié)
以上是生活随笔為你收集整理的Python SIP使用总结(WinLinux通用)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 自定义ProgressBar(圆)
- 下一篇: 学校计算机课怎取消红蜘蛛,谁知道怎么退出