使用SIP對C庫進行Python封裝

    Python中使用C/C++模塊有許多工具,大名鼎鼎的有SWIG(英文意思爲:豪飲)、SIP(英文意思爲:啜飲,小口的喝),還有 boost.python等。其中SIP是從SWIG發展而來,專爲Python調用C/C++模塊使用的(看SIP的命名就能看出來,頗有意思的)。python

        SIP的使用方法,在官網的SIP Reference Guide中有介紹,不過那是針對至少有點經驗的人員,對初學者來講,想十分鐘快速上手仍是有點難度的。這裏就介紹下本人在使用SIP總結的須要注意的地 方。(本着方便你們方便本身的原則,歡迎轉載,無需徵得本人贊成,但請註明出處,最好是原文鏈接,圖我的氣,謝謝!)linux

        前提,本機上要裝了Python、GCC(Windows下能夠用MinGW,在個人Eclipse下配置CDT一文中有關於MinGW的安裝介紹)。並把python.exe和MinGW下的bin文件路徑添加到環境變量中。sql

第一部分:安裝SIPapp

        Windows:ide

        將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++寫的函數。

        一、首先,編寫個C文件,功能是將兩個數字相加並輸出,命名爲add.c,這個將成爲在Python中的模塊名,以下:


/* File : add.c */  
int add(int x, int y)   
{    
    int g;    
    g = x + y;  
    return g;  
}

        二、接着,手工編寫SIP文件,在使用SIP的過程當中,一個C/C++的源碼文件,必須對應一個同名的sip文件,命名爲add.sip,以下:

[plain] view plaincopy

  1. /* Define the SIP wrapper to the add library. */  

  2. %Module(name=add, language="C")  

  3. int add(int x, int y);       

        若是是源程序是用C++寫的,那麼這裏的(name=add, language="C")就能夠省去。
        這裏的C源碼文件沒有頭文件,因此對應的sip文件很簡單。若是C/C++的源碼是實現部分,在實現部分還包括接口部分,即頭文件。那麼在相應的sip文件中須要用

[cpp] view plaincopy

  1. %TypeHeaderCode  

  2. #include <word.h>  

  3. %End  

        來包含相應的頭文件。sip文件與正式的C/C++頭文件類似,但與之不一樣的是:sip文件不包含相應的頭文件的私有成員變量(private或 protected)。更詳細的sip文件編寫規範,請參考riverbank官方網站上的說明文檔SIP Reference Guide。

三、編譯C文件。按照官網的說法,是編寫configure.py,但別急,先作一些必不可少的工做。在命令行將add.c編譯成add.o文件:輸入

[sql] view plaincopy

  1. gcc -c add.c  

接着,將這一步生成的add.o文件生產庫文件:

[plain] view plaincopy

  1. ar -r libadd.a add.o  

這兩步在這裏是爲一個單獨的C模塊測試的,若是是大量的C模塊,能夠用一個makefile一併批量完成,這也是初學者容易模糊的地方。記住,須要將libadd.a文件複製到Python文件夾下的libs文件夾中。也能夠將源代碼直接編譯成dll,命令爲

        四、手工編寫configure.py文件,一樣,這個configure文件的編寫也不難,看下規範就會了(要會鳥語。。。)。這裏,咱們模仿官網的模版寫一個本身的configure.py。

[python] view plaincopy

  1. import os  

  2. import sipconfig  

  3.   

  4. # The name of the SIP build file generated by SIP and used by the build  

  5. # system.  

  6. build_file = "add.sbf"  

  7.   

  8. # Get the SIP configuration information.  

  9. config = sipconfig.Configuration()  

  10.   

  11. # Run SIP to generate the code.  

  12. os.system(" ".join([config.sip_bin, "-c", ".", "-b", build_file, "add.sip"]))  

  13.   

  14. # Create the Makefile.  

  15. makefile = sipconfig.SIPModuleMakefile(config, build_file)  

  16.   

  17. # Add the library we are wrapping.  The name doesn't include any platform  

  18. # specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the  

  19. # ".dll" extension on Windows).  

  20. makefile.extra_libs = ["add"]  

  21.   

  22. # Generate the Makefile itself.  

  23. makefile.generate()  

        五、運行configure.py,會生成一個makefile文件(直接用IDLE打開configure.py,按F5運行;或者命令行用python configure.py運行均可以)。
這裏有個詭異的地方,有幾個朋友在這一步會報錯,說找不到add.sbf文件,而add.sbf文件應該是configure.py運行時調用相關函數自 動產生的。若出現這個問題,請從新編譯SIP。若是是Windows下,最好是在另外一臺機器上拷貝一個完整的包含能正常的SIP的Python文件夾,到 有問題的機器上,將問題Python文件夾覆蓋掉。

        六、在命令行輸入make(這裏會生成一個關於函數的警告,不用管它,咱們是用來測試的。。。其餘的應該沒什麼問題,如有問題請檢查前面的步驟),生成add.pyd文件。而後再輸入make install(將add.pyd文件裝入到Python的Lib文件夾下的sit-packages文件夾中)。

        七、打開Python 的命令行,進行測試:

[python] view plaincopy

  1. >>>import add  

  2. >>>add.add(4, 7)  

  3. 11  

  4. >>>  

(原諒我這麼爛的模塊名。。。)

提示:

(1)、這些文件能夠放到Python的文件夾下新建的文件夾中(全部的操做在這個目錄下的命令行窗口中使用)。注意,Python的父文件夾名不能有空格,不然會沒法讀取庫文件。

(2)、使用MinGW,須要把~\MinGW\bin添加的環境變量中(Linux下則沒必要),這樣才能使用gcc、make和ar等工具。

相關文章
相關標籤/搜索