介紹
本文是SIP4.18的參考指南武花。SIP是一種Python工具振湾,用于自動(dòng)生成Python與C、C++庫的綁定。SIP最初是在1998年用PyQt開發(fā)的锨匆,用于Python與Qt GUI toolkit的綁定,但適用于生成任何C或C++庫的綁定。
此版本SIP生成的綁定可用于Python 2.3以后的版本恐锣,包括Python 3.x茅主。
還有許多其他類似的工具,例如SWIG土榴。事實(shí)上诀姚,SIP如此名字是因?yàn)樗从谝粋€(gè)小型的SWIG。但不像SWIG玷禽,SIP是特別設(shè)計(jì)于將Python與C/C++進(jìn)行綁定的赫段,它盡可能地集成更多C/C++的功能。
SIP官網(wǎng):http://www.riverbankcomputing.com/software/sip
在這里你總能找到最新的穩(wěn)定版與最新版的文檔矢赁。
SIP也可以從Mercurial庫下載:http://www.riverbankcomputing.com/hg/sip.
許可
SIP許可類似于Python糯笙,也采用GPL協(xié)議(包括v2和v3)。如果你使用SIP撩银,意味著你必須遵循GPL協(xié)議给涕。
特征
SIP和它所生成的綁定擁有如下特征:
加載迅速,內(nèi)存占用低额获。
自動(dòng)轉(zhuǎn)換標(biāo)準(zhǔn)的Python與C/C++數(shù)據(jù)類型够庙。
不同參數(shù)簽名的函數(shù)和方法的重載
訪問C++類的protected方法
能夠定義一個(gè)繼承于C++類型的Python子類,包括C++抽象類
Python子類可以實(shí)現(xiàn)__dtor__()方法來支持C++類的虛析構(gòu)函數(shù)的調(diào)用咪啡。
支持普通C++函數(shù)首启、類方法、靜態(tài)類方法撤摸、虛類方法和抽象類方法毅桃。
可以在Python中重新實(shí)現(xiàn)C++虛/抽象方法
支持全局和Class變量
支持全局和Class操作
支持C++命名空間
支持C++模板
支持C++異常并轉(zhuǎn)換為Python異常
豐富的comparsion slots的自動(dòng)生成
支持deprecation警告
支持定義C++類與相似的Python數(shù)據(jù)類型的映射,并自動(dòng)調(diào)用
支持自動(dòng)利用任何可用的運(yùn)行時(shí)類型信息准夷,確保Python實(shí)例對(duì)象類型與對(duì)應(yīng)的C++對(duì)象實(shí)例相匹配
可以轉(zhuǎn)換在類型與meta類型之間轉(zhuǎn)換python對(duì)象钥飞,用以包裝一個(gè)C/C++數(shù)據(jù)類型
支持Python全局解釋器鎖,包括指示一個(gè)C++函數(shù)可能被阻塞衫嵌,從而允許釋放鎖读宙,讓其他Python線程運(yùn)行。
支持將多個(gè)簡(jiǎn)單的或私有相關(guān)的模塊合并為一個(gè)模塊楔绞。
支持C++實(shí)例所有權(quán)概念(即代碼的哪些部分負(fù)責(zé)調(diào)用實(shí)例的析構(gòu)函數(shù))结闸,支持所有權(quán)在應(yīng)用程序運(yùn)行期間的改變。
產(chǎn)生一個(gè)本身建立在其他C++類庫之上的C++類庫酒朵,允許不同的bindings之間代碼集成與共享桦锄。
支持用一套規(guī)范的文件,定義復(fù)雜的版本控制系統(tǒng)蔫耽。允許控制C++類庫的全生命周期结耀,包括指定特定于平臺(tái)的可選功能。
支持自動(dòng)生成PEP 484 類型hint stub文件,可以在指定的文件中包含說明文檔图甜,并允許外部工具提取和處理碍粥。
可以在所有生成的源碼中自動(dòng)包含規(guī)范文件中所聲明的版權(quán)和授權(quán)信息。
可以在Python書寫的構(gòu)建系統(tǒng)中繼承配置黑毅,編譯并且安裝你自己的綁定嚼摩,從而無需擔(dān)心平臺(tái)的具體問題。
使用distutils構(gòu)建你的擴(kuò)展支持博肋。
SIP以及其生成的bindings低斋,可以運(yùn)行在UNIX,Linux匪凡,Windows膊畴,MacOS/X,Android and iOS中
SIP組件
SIP由一些不同的組件構(gòu)成病游。
SIP代碼生成器唇跨。它處理.sip規(guī)范文件并生成C或C++bindings。轉(zhuǎn)換詳情參考《使用SIP(Using SIP)》一節(jié)衬衬。
SIP頭文件(sip.h)买猖。它包含生成C與C++代碼所需要的規(guī)范與數(shù)據(jù)結(jié)構(gòu)。
SIP模塊(sip.so或sip.pyd)滋尉。這是一個(gè)python擴(kuò)展模塊玉控,自動(dòng)由SIP生成的bindings導(dǎo)入,并為它們提供一些通用的工具函數(shù)狮惜。詳情參考《應(yīng)用程序Python API(Python API for Applications)》
SIP構(gòu)建系統(tǒng)(sipconfig.py)高诺。它是一個(gè)純python模塊,在SIP被配置并封裝所有系統(tǒng)的相關(guān)信息時(shí)被創(chuàng)建碾篡。它包含目錄名稱虱而、編譯和鏈接標(biāo)志以及版本號(hào),它也包含一些Python類與函數(shù)开泽。它幫助你為bindings編寫配置腳本牡拇。
SIP distutils擴(kuò)展(sipdistutils.py)。這是一個(gè)distutils擴(kuò)展穆律,可以用distutils構(gòu)建你的擴(kuò)展模塊惠呼。用于替代手動(dòng)編寫SIP構(gòu)建系統(tǒng)的配置腳本。它可以很簡(jiǎn)單的添加.sip文件到你需要構(gòu)建和擴(kuò)展的文件清單峦耘。詳情參見《用distutils構(gòu)建擴(kuò)展(Building Your Extension with distutils)》罢杉。
SIP v5的準(zhǔn)備
SIP指定文件的語法將在SIP v5中改變。SIP代碼生成器的命令行選項(xiàng)也會(huì)改變贡歧。為了幫助用戶管理過度,將采用以下方法
盡可能把所有不兼容的變更,首先在SIP v4中實(shí)現(xiàn)利朵。
不兼容的變更實(shí)現(xiàn)之后律想,老的語法將被指定為deprecated(提示警告),但仍然在v4中支持绍弟。
Qt支持
SIP為創(chuàng)建基于Digia的Qt 工具包提供支持技即。
SIP代碼生成器理解signal/slot類型安全的回調(diào)機(jī)制,該機(jī)制被Qt用于把對(duì)象連接到一起樟遣。它允許應(yīng)用程序定義新的Python signals而叼,并且允許python調(diào)用對(duì)象可以像slot一樣使用。