python库封装_使用SIP对C库进行Python封装
Python中使用C/C++模塊有許多工具,大名鼎鼎的有SWIG(英文意思為:豪飲)、SIP(英文意思為:啜飲,小口的喝),還有 boost.python等。其中SIP是從SWIG發展而來,專為Python調用C/C++模塊使用的(看SIP的命名就能看出來,很有意思的)。
SIP的使用方法,在官網的SIP Reference Guide中有介紹,不過那是針對至少有點經驗的人員,對初學者來說,想十分鐘快速上手還是有點難度的。這里就介紹下本人在使用SIP總結的需要注意的地 方。(本著方便大家方便自己的原則,歡迎轉載,無需征得本人同意,但請注明出處,最好是原文連接,圖個人氣,謝謝!)
前提,本機上要裝了Python、GCC(Windows下可以用MinGW,在我的Eclipse下配置CDT一文中有關于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;
}
2、接著,手工編寫SIP文件,在使用SIP的過程中,一個C/C++的源碼文件,必須對應一個同名的sip文件,命名為add.sip,如下:
/*?Define?the?SIP?wrapper?to?the?add?library.?*/
%Module(name=add,?language="C")
int?add(int?x,?int?y);
如果是源程序是用C++寫的,那么這里的(name=add, language="C")就可以省去。
這里的C源碼文件沒有頭文件,所以對應的sip文件很簡單。如果C/C++的源碼是實現部分,在實現部分還包括接口部分,即頭文件。那么在相應的sip文件中需要用
%TypeHeaderCode
#include?
%End
來包含相應的頭文件。sip文件與正式的C/C++頭文件相似,但與之不同的是:sip文件不包含相應的頭文件的私有成員變量(private或 protected)。更詳細的sip文件編寫規范,請參考riverbank官方網站上的說明文檔SIP Reference Guide。
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,命令為
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()
5、運行configure.py,會生成一個makefile文件(直接用IDLE打開configure.py,按F5運行;或者命令行用python configure.py運行都可以)。
這里有個詭異的地方,有幾個朋友在這一步會報錯,說找不到add.sbf文件,而add.sbf文件應該是configure.py運行時調用相關函數自 動產生的。若出現這個問題,請重新編譯SIP。如果是Windows下,最好是在另一臺機器上拷貝一個完整的包含能正常的SIP的Python文件夾,到 有問題的機器上,將問題Python文件夾覆蓋掉。
6、在命令行輸入make(這里會生成一個關于函數的警告,不用管它,我們是用來測試的。。。其他的應該沒什么問題,若有問題請檢查前面的步驟),生成add.pyd文件。然后再輸入make install(將add.pyd文件裝入到Python的Lib文件夾下的sit-packages文件夾中)。
7、打開Python 的命令行,進行測試:
>>>import?add
>>>add.add(4,?7)
11
>>>
(原諒我這么爛的模塊名。。。)
提示:
(1)、這些文件可以放到Python的文件夾下新建的文件夾中(所有的操作在這個目錄下的命令行窗口中使用)。注意,Python的父文件夾名不能有空格,否則會無法讀取庫文件。
(2)、使用MinGW,需要把~\MinGW\bin添加的環境變量中(Linux下則不必),這樣才能使用gcc、make和ar等工具。
總結
以上是生活随笔為你收集整理的python库封装_使用SIP对C库进行Python封装的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: hpy计算机维护系统,HPY计算机维护P
- 下一篇: pr如何跳到关键帧_pr怎么跟踪?pr怎
