2023年11月20日 05:15,by 舒彩光
只要會c語言程式設計就很容易為python新增新的內建模組。可以通的c的擴充套件模組做兩種事,一是實現新的內建物件型別。另乙個是呼叫c的庫函式與系統呼叫。
為了支援c擴充套件,python api定義了一系列函式,變數及巨集。只要在c或c++**裡引入「python.h」標頭檔案就可以使用這些定義。
現在我們寫乙個簡單的擴充套件模組例項,用c輸出hello world!。我們將這個模組命名為hello。於是我們
建立乙個名稱為hellomodule.c的檔案,檔案第一行我們引入標頭檔案
1
#include
python api 裡的變數,函式,巨集都是是 py或py 開頭。在python.h 裡已經包含了和這幾個標頭檔案。如果這些系統標頭檔案不存在,python將自己定義malloc(),free(),和realloc()三個函式。
接下來我們將要實現的功能以c函式的形式定在**裡
1
2
3
4
static
pyobject* hello(pyobject* self,pyobject* args)
這個函式只有乙個功能就是返回hello world!的字串。這個c函式包含self與args兩個引數。
如果當作模組函式,self通常為null或初始化模組時選擇的指標。如果作為方法,self指向物件例項
args顧名思義是python傳給c的引數,它是以元組的形式組合的多個引數。用pyarg_parsetuple()函式就可將這個元組轉換為c的值。以後的內容我們會介紹這個函式。
為了能夠在python中呼叫這個c函式,我們需要將函式名稱和函式位址寫進函式表。
1
2
3
4
static
pymethoddef methods=,
};
第三個引數「meth_varargs」告訴直譯器用於c函式的呼叫約定,這個引數經常是「meth_varargs」或「meth_varargs|meth_keywords」。
如果只為meth_varargs時, 傳入的引數可以使用pyarg_parsetuple()解析
如果包含meth_keywords,這個函式將會有三個引數keywords
hello(pyobject* self,pyobject* args,pyobject* keywords)
第三個引數需要用pyarg_parsetupleandkeywords()解析出裡面的值
函式表必須通過初始函式傳遞給解析器。初始化函式的名稱必須是init+模組名。這個函式必須是non-static的。我們示例中的初始化函式如下:
1
2
3
4
pymodinit_func inithello()
pymodinit_func定義這個函式的返回值為void型別。如果**是c++還定義extern "c"
至此整個hellomodule.c的內容全部完成。
在hellomodule.c檔案同目錄編寫setup.py內容如下:
1
2
3
4
from
distutils.core
import
setup, extension
mod
=
'hello'
setup(name
=
mod,ext_modules
=
[extension(mod,sources
=
[
'hellowmodule.c'
])])
編寫完後,儲存退出。輸入如下的命令:
1
setup.py build
然後就會開始編譯成hello模組
執行命今
1
setup.py
install
剛剛編譯好的模組就已安裝完成。
編寫測試**test.py:
1
2
3
4
import
hello
s
=
hello.hello()
print
s
儲存執行一下test.py。輸出結果為
1
hello world!
用PACKAGE封裝資料的乙個簡單演示
資料封裝有幾個好處 1.可讀性提高了 2.資料結構發生變化時,更新工作可以最小化且集中化處理 3.隱藏了底層資料結構,對商業保密起到一定作用。下面以乙個案例演示一下資料封裝的過程 在common使用者下,我有乙個t log表用來記錄程式執行日誌,其結構如下 為了將寫日誌的介面開放給其他使用者,我建立...
乙個游標簡單示例
下面是乙個游標的例項,方便初學者學習,也可以防止自己忘記 if exists select 1 from sysobjects where name hehe drop procedure hehe goset ansi nulls on set quoted identifier on gocre...
在乙個python裡執行另乙個python檔案
os.popen cmd,mode r buffering 1 command 呼叫的命令 mode 模式許可權可以是 r 預設 或 w bufsize 指明了檔案需要的緩衝大小 0意味著無緩衝 1意味著行緩衝 其它正值表示使用引數大小的緩衝 大概值,以位元組為單位 負的bufsize意味著使用系統...