使用C語言擴充套件Python 四

2021-08-25 04:58:11 字數 3227 閱讀 3359

首先,遵循"測試先行"的原則,先來看我們改造後的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

pymethoddefencoder_methods=,

,};static

pytypeobjectclame_encodertype=;

static

pymethoddefclame_methods=};

pymodinit_funcinitclame()

編譯過程:

gcc-shared-i

/usr

/include

/python2.6

-i/usr/

local

/include

/lameclame

.c-l***lame-oclame.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...