用乙個簡單示例演示在python中呼叫C及C

2021-07-25 13:17:27 字數 2667 閱讀 9662

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

staticpyobject* 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

staticpymethoddef 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

fromdistutils.coreimportsetup, extension

mod='hello'

setup(name=mod,ext_modules=[extension(mod,sources=['hellowmodule.c'])])

編寫完後,儲存退出。輸入如下的命令:

1

setup.py build

然後就會開始編譯成hello模組

執行命今

1

setup.pyinstall

剛剛編譯好的模組就已安裝完成。

編寫測試**test.py:

1

2

3

4

importhello

s=hello.hello()

prints

儲存執行一下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意味著使用系統...