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
/* 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文件中須要用
[cpp] view plaincopy
%TypeHeaderCode
#include <word.h>
%End
來包含相應的頭文件。sip文件與正式的C/C++頭文件類似,但與之不一樣的是:sip文件不包含相應的頭文件的私有成員變量(private或 protected)。更詳細的sip文件編寫規範,請參考riverbank官方網站上的說明文檔SIP Reference Guide。
三、編譯C文件。按照官網的說法,是編寫configure.py,但別急,先作一些必不可少的工做。在命令行將add.c編譯成add.o文件:輸入
[sql] view plaincopy
gcc -c add.c
接着,將這一步生成的add.o文件生產庫文件:
[plain] view plaincopy
ar -r libadd.a add.o
這兩步在這裏是爲一個單獨的C模塊測試的,若是是大量的C模塊,能夠用一個makefile一併批量完成,這也是初學者容易模糊的地方。記住,須要將libadd.a文件複製到Python文件夾下的libs文件夾中。也能夠將源代碼直接編譯成dll,命令爲
四、手工編寫configure.py文件,一樣,這個configure文件的編寫也不難,看下規範就會了(要會鳥語。。。)。這裏,咱們模仿官網的模版寫一個本身的configure.py。
[python] view plaincopy
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()
五、運行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
>>>import add
>>>add.add(4, 7)
11
>>>
(原諒我這麼爛的模塊名。。。)
提示:
(1)、這些文件能夠放到Python的文件夾下新建的文件夾中(全部的操做在這個目錄下的命令行窗口中使用)。注意,Python的父文件夾名不能有空格,不然會沒法讀取庫文件。
(2)、使用MinGW,須要把~\MinGW\bin添加的環境變量中(Linux下則沒必要),這樣才能使用gcc、make和ar等工具。