使用C語言擴充套件Python 四

2021-09-05 23:45:44 字數 3293 閱讀 7173

首先,遵循"測試先行"的原則,先來看我們改造後的python這一端,你可以每次讀取音訊原始檔的乙個資料塊,將其轉遞給encoder物件的encode方法,這樣無論你的原始檔是何種格式,你都可以在encoder中進行自由的控制,示例**如下:

import

clame

inbufsize 

=4096

if__name__=='

__main__':

encoder 

=clame.encoder(

'test.***')

input 

=file(

'test.raw', 

'rb')

data 

=input.read(inbufsize)

while

data 

!=''

:encoder.encode(data)

data 

=input.read(inbufsize)

input.close()

encoder.close()

再來看c擴充套件模組這一端,下面是完整的**:

#include 

<

python.h

>

#include 

<

lame.h

>

typedef 

struct

clame_encoderobject;

static

pyobject

*encoder_new(pytypeobject

*type, pyobject

*args, pyobject

*kw) 

static

void

encoder_dealloc(clame_encoderobject

*self) 

if(self

->

outfp) 

self

->

ob_type

->

tp_free(self);

}static

intencoder_init(clame_encoderobject

*self, pyobject

*args, pyobject

*kw) 

if(self

->

outfp 

||self

->

gfp) 

self

->

outfp 

=fopen(outpath, "wb

");self

->

gfp 

=lame_init();

lame_init_params(self

->

gfp);

return0;

}static

pyobject

*encoder_encode(clame_encoderobject

*self, pyobject

*args) if(

!pyarg_parsetuple(args, "s#

", &in_buffer, 

&in_length)) 

in_length /=2

;***_length =(

int)(

1.25

*in_length) 

+7200

;***_buffer =(

char

*)malloc(***_length);

if(in_length 

>0) 

}free(***_buffer);

py_return_none;

}static

pyobject

*encoder_close(clame_encoderobject

*self) 

***_length 

=7200

;***_buffer =(

char

*)malloc(***_length);

***_bytes 

=lame_encode_flush(self

->

gfp, ***_buffer, 

sizeof

(***_buffer));

if(***_bytes 

>0) 

free(***_buffer);

lame_close(self

->

gfp);

self

->

gfp 

=null;

fclose(self

->

outfp);

self

->

outfp 

=null;

py_return_none;

}static

pymethoddef encoder_methods =,

,};static

pytypeobject clame_encodertype =;

static

pymethoddef clame_methods =};

pymodinit_func initclame() 

編譯過程:

gcc -shared -i 

/usr

/include

/python2.6

-i /

usr/

local

/include

/lame clame

.c -l***lame -o clame.so

首先定義了clame_encoderobject結構體,這個結構體就是用來儲存狀態資訊的,欄位outfp用來儲存輸出檔案,gfp則儲存lame的狀態,可以用來檢查是否已經是重複呼叫已經呼叫過的函式了。

為了建立這個結構體的乙個新例項,我們需要定義encoder_new函式,你可以把這個函式視為python裡的__new__方法,當python直譯器需要建立你定義的型別的新例項時就會去呼叫這個方法。在這個方法裡沒作什麼操作,僅僅是做初始化工作,把outfp和gfp都設定為null,此外,與encoder_new函式對應,還需要定義encoder_dealloc方法來對例項進行析構,你可以把這個函式視為python的__del__方法,clame_encodertype結構體則是真正定義了我們的encoder物件,它的各個字段指定了_new,_close,_encode,_dealloc等方法。在initclame方法中,pymoduleobject則實際指定了在python程式中使用的encoder物件。 

使用C語言擴充套件Python 四

首先,遵循 測試先行 的原則,先來看我們改造後的python這一端,你可以每次讀取音訊原始檔的乙個資料塊,將其轉遞給encoder物件的encode方法,這樣無論你的原始檔是何種格式,你都可以在encoder中進行自由的控制,示例 如下 import clame inbufsize 4096 if ...

使用c語言擴充套件python

背景 我們工作中可能有時需要和第三方對接,而第三方提供的sdk可能是c語言或者c 編寫的,而我們程式使用的語言是python,這時候就需要使用python呼叫c庫 參考官方文件 編寫python擴充套件分三步 第一步 建立應用 使用c語言編寫具體的功能 如果sdk已經提供了並且不需要我們整合,則跳過...

C語言擴充套件Python

python具有很好的開發靈活性,最大的特點是c語言可以對python進行擴充套件,目前工作中正在進行相關的開發,第一篇文章作為基礎.實現c函式,用python api封裝,實現倆個功能,1.say hello,列印hello world 2.calc pv,做加法用算.以下為使用方法 01pyth...