




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、淺談python程序和c程序的整合【it168技術(shù)文檔】前言:python是種用于快速開發(fā)軟件的編程語言,它的語法比較簡單,易于掌握,但存在執(zhí)行速度慢 的問題,并在處理某些問題時(shí)存在不足,如對(duì)計(jì)篦機(jī)硬件系統(tǒng)的訪問,對(duì)媒體文件的訪問等。而作為軟件開 發(fā)的傳統(tǒng)編程語言c語言,卻能在這些問題上很好地彌補(bǔ)python語言的不足。因此,本文通過實(shí)例研究如 何在python程序中整合既有的c語言模塊,包括用c語言編寫的源程序和動(dòng)態(tài)鏈接庫等,從而充分發(fā)揮 python語言和c語言各自的優(yōu)勢。概覽python是-種用于快速開發(fā)軟件的編程語言,它的語法比較簡單,易于掌握,但存在執(zhí)行速度慢的問題, 并且在處理某些
2、問題時(shí)存在不足,如對(duì)計(jì)算機(jī)硬件系統(tǒng)的訪問,對(duì)媒體文件的訪問等。而作為軟件開發(fā)的傳統(tǒng) 編程語言 c語言,卻能在這些問題上很好地彌補(bǔ)python語言的不足。因此,木文通過實(shí)例研究如何在 python程序屮整合既有的c語言模塊,包括用c語言編寫的源程序和動(dòng)態(tài)鏈接庫等,從而充分發(fā)揮python 語言和c語言各h的優(yōu)勢。背景知識(shí)介紹python語言的特點(diǎn)python作為一門程序開發(fā)語言,被越來越多地運(yùn)川到快速程序開發(fā)。python是一種解釋型的,互動(dòng)的, 面向?qū)ο蟮木幊陶Z言,它包含了模塊化的操作,異常處理,動(dòng)態(tài)資料形態(tài),以及類型的使用。它的語法表達(dá)優(yōu) 美易讀,具有很多優(yōu)秀的腳本語言的特點(diǎn):解釋的,而向?qū)?/p>
3、彖的,內(nèi)建的鬲級(jí)數(shù)據(jù)結(jié)構(gòu),支持模塊和包,支持 多種平臺(tái),可擴(kuò)展。而且它述支持交互式方式運(yùn)行,圖形方式運(yùn)行。它擁有眾多的編程界面支持各種操作系統(tǒng) 平臺(tái)以及眾多的各類函數(shù)庫,利用c和c+可以對(duì)它進(jìn)行擴(kuò)充。c語言的特點(diǎn)c語言作為最受人們歡迎的語言有廣泛的發(fā)展基礎(chǔ)。簡潔緊湊、靈活方便,功能強(qiáng)大是其特點(diǎn)。另 外,c語言是一門中級(jí)語言。它把高級(jí)語言的基本結(jié)構(gòu)和語句與低級(jí)語言的實(shí)用性結(jié)合起來。由于可以直接訪 問物理地址,可以方便的對(duì)喚件進(jìn)行操作。因此,很多的系統(tǒng)軟件都是由c語言編寫。python語言與c語言的交互為了節(jié)省軟件開發(fā)成本,軟件開發(fā)人員希望能夠縮短的軟件的開發(fā)時(shí)間,希望能夠在短時(shí)間內(nèi)開發(fā)出穩(wěn)定 的
4、產(chǎn)品。python功能強(qiáng)大,簡單易用,能夠快速開發(fā)應(yīng)用軟件。但是由于python自身執(zhí)行速度的局限性, 對(duì)性能要求比較高的模塊需要使用效率更高的程序語言進(jìn)行開發(fā),例如c語言,系統(tǒng)的其他模塊運(yùn)用python 進(jìn)行快速開發(fā),最后將c語言開發(fā)的模塊與python開發(fā)的模塊進(jìn)行整合。在此背景下,基于python語言 與c語言的各口特點(diǎn),用c語言來擴(kuò)展現(xiàn)有的python程序,顯得很有意義。本文首先介紹幾種常用的整合 python程序與c語言程序的方法,最后給出相應(yīng)的實(shí)例。利用ctypes模塊整合python程序和c程序ctypes模塊ctypes是python的一個(gè)標(biāo)準(zhǔn)模塊,它包含在python2. 3
5、及以上的版本里。ctypes是一個(gè)python的 高級(jí)外部函數(shù)接口,它使得python程序可以調(diào)用c語言編譯的靜態(tài)鏈接庫和動(dòng)態(tài)鏈接庫。運(yùn)用ctypes模 塊,能夠在python源程序中創(chuàng)建,訪問和操作簡單的或復(fù)雜的c語言數(shù)據(jù)類型。最為重要的是ctypes模塊能夠在多個(gè)平臺(tái)上工作,包括 windows, windows ce, mac os x, linux, solaris, freebsd, openbsdo 接下來通過幾個(gè)簡單的例了來看一下ctypes模塊如何整合python程序和c程序。源代碼層面上的整合利用python本身提供的ctypes模塊可以使python語言和c語言在源代碼層面
6、上進(jìn)行整合。本節(jié)介 紹了如何通過使用ctypes庫,在python程序中可以定義類似c語言的變量。下表列出了 ctypes變量類型,c語言變量類型和python語言變量類型之間的關(guān)系:表1. ctypes, c語言和python語言變量類型關(guān)系ctypes typec typepython typec_charchar1-character stri ngc_wcharwchar_t1-character unicode stringc_bytechar|int/lo ngic_ubyte 炳頭術(shù)械|int/long -:c_shortshortint/longc_ushortunsigned
7、 shortint/longc_intintint/longc_uint unsigned intint/longejonglongint/longc_ul0ng unsigned longint/longc_longlong_int64long long|int/longcjjlon glongunsigned _int64 or unsigned long longint/longc_floatifloatc_double doublefloatc_char_pchar * (nul terminated)string ononec_wchar_p _wchar_t* (nul termi
8、nated)unicode or nonec_void_pvoid *int/long onone表1中的第一列是在ctypes庫中定義的變量類型,第二列是c語言定義的變量類型,第三列是python 語言在不使用ctypes時(shí)定義的變量類型。舉例:清單1. ctypes簡單使用»>from ctypesimport *#導(dǎo)入ctypes庫屮所有模塊»>i= cint(45)#定義一個(gè)int型變量,值為45»>i value#打印變量的值45»>i. value= 56#改變該變量的值為56»>i.value#打印變
9、量的新值56從下而的例子可以更明顯地看出ctypes里的變量類型和c語言變量類型的相似性: 清單2. ctypes使用c語言變量»> p= create string buffer(10)#泄義個(gè)可變字符串變量,長度為10»> p. raw#初始值是全0,即c語言中的字符串結(jié)束符0 ''x00x00x00x00x00x00x00x00x00x00,»> p. value二"student"# 字符串賦值>>> p. raw'studentx00x00x00,»> p.
10、value= "big"»> p. raw'bigx00entx00x00x00,#后三個(gè)字符仍是'0 '#再次賦值#只有前三個(gè)字符被修改,第四個(gè)字符被修改為'0 '下而例子說明了指針操作:清單3. ctypes使用c語言指針»> i= c_int (999)#定義int類型變量1,值為999>>> pi= pointer(i)#定義指針,指向變量i»> pi. contents#打印指針?biāo)傅膬?nèi)容c_long(999)>» pi. contents=
11、c_long(1000)#通過指針改變變量i的值>» pi contents#打印指針?biāo)傅膬?nèi)容c_long(1000)下面例子說明了結(jié)構(gòu)和數(shù)組的操作:清單4. ctypes使用c語言數(shù)組和結(jié)構(gòu)體»>#定義一個(gè)結(jié)構(gòu),內(nèi)含兩個(gè)成員變量x, y,均為int型class point(structure):_fields_= ("x", c_int),cy", c_int)»>»>point= point(2, 5) print point. x, point, y#定義一個(gè)point類型的變量,初始值為x二
12、2, y=5#打印變量»>»>point= point (y=5) print point, x, point, y#重新定義一個(gè)potnt類型變量,x取默認(rèn)值#打印變量05»>#定義一個(gè)point數(shù)組,內(nèi)含三個(gè)point變量»> pa= p0int_array(p0int(7, 7), point(8, 8), point(9, 9)»> for pin pa:print p. x, p. y#打卬point數(shù)組中每個(gè)成員的值point array- point* 3#定義point array為point的數(shù)組
13、類型python訪問c語言dll通過ctypes模塊,python程序?qū)σ栽L問c語言編譯的dll,本節(jié)通過一個(gè)簡單的例子,python程序hel loworld. py屮調(diào)用some, dl 1屮的hel loworld函數(shù),來介紹python程序如何調(diào)用windows平臺(tái)上的 dllo導(dǎo)入動(dòng)態(tài)鏈接庫清單5. ctypes導(dǎo)入dllfrom ctypesimport windl 1# 首先導(dǎo)入 ctypes 模塊的 wi nd 11 子模塊somelibc= windl 1. loadlibrary (some, dll)# 使用 windl 1 模塊的 loadlibrary 導(dǎo)入動(dòng)態(tài)鏈接庫
14、訪問動(dòng)態(tài)鏈接庫中的函數(shù)清單6. ctypes使用dll屮的函數(shù)somelibc. helloworld()# 這樣就可以得到 some, dll 的 helloworld 的返回值。整個(gè)helloworld, py是這樣的:清單 7. python hel lpworl d 代碼from ctypesimport windlldef calle ():# load the some, dllsomel ibc= wi ndl1. loadlibrary(some, dl 1)print somelibc. helloworld()if name_=_main_ :calle ()在命令行運(yùn)行h
15、elloworld, py,在console上可以看至! some, dl 1中hel loworld的輸出。清單 8. python hellpworld windows command console 運(yùn)彳亍輸出c:>python c:pythontesthelloworld. pyhello world! just a simple test.python調(diào)用c語言so通過ctypes模塊,python程序也可以訪問c語言編譯的so文件。與python調(diào)用c的dll的方法 基本相同,本節(jié)通過一個(gè)簡單的例子,python程序helloworld, py中調(diào)用some, so中的hel
16、loworld函數(shù), 來介紹python程序如何調(diào)用linux平臺(tái)上的so。導(dǎo)入動(dòng)態(tài)鏈接庫清單9. ctypes導(dǎo)入sofrom ctypesimport cdll#首先導(dǎo)入ctypes模塊的cdll子模塊,注意linux平臺(tái)上使用cdll的,而不是windll。somelibc= cdll. loadlibrary( “./some, so” )#使用cdll模塊的loadlibrary導(dǎo)入動(dòng)態(tài)鏈接庫訪問動(dòng)態(tài)鏈接庫中的函數(shù)清單10ctypes使川so中的函數(shù)somelibc. helloworld()#使丿u方法與windows平臺(tái)上是樣的。整個(gè)helloworld, py是這樣的: 清單
17、11. python helloworld 代碼rom ctypesimport cdl1def calle0:# load the some- sosome 1ibc= cdl1 loadlibrary(some, so) print somelibc- helloworldoifname_二二_ main :cal lc ()在命令行運(yùn)行helloworld, py,在linux標(biāo)準(zhǔn)輸出上可以看到some, so中helloworld的輸出。清單 12. python hellpworld linux shell 運(yùn)行輸出rootlinux-790t python . /helloworl
18、d, pyhel1o world! just a simple test.python程序和c程序整合實(shí)例以下我們舉例用python來實(shí)現(xiàn)一個(gè)小工具,用來實(shí)現(xiàn)hash算法,杳看文件的校驗(yàn)和(md5, crc, sha1等 等)。通過查看文件的校驗(yàn)和,可以知道文件在傳輸過程中是否被破壞或篡改。hash, 一般翻譯做“散列”,也有直接音譯為哈希的,就是把任意長度的輸入(又叫做預(yù)映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉(zhuǎn)換是一種壓縮映射,也就是, 散列值的空間通常遠(yuǎn)小于輸入的空間,不同的輸入可能會(huì)散列成相同的輸出,而不可能從散列值來唯一的確定 輸入值。
19、簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數(shù)。由于相對(duì)c語言來說,python的運(yùn)行效率較低,因此我們的python小工具利用一個(gè)已有的c語言的 動(dòng)態(tài)鏈接庫(hashtcalc. dll)來實(shí)現(xiàn)我們的程序。本例中,我們運(yùn)用wxpython編寫簡單的gui界面,通過 python調(diào)用hashtcalc. dll的接口計(jì)算文件的校驗(yàn)和,然后輸出在界面上。架構(gòu)圖圖1.工具的架構(gòu)圖gui: wxpythonlogic tierhashcalcadapteiother libshashcalc.dll3rd party tool and lib你的技術(shù)開發(fā)頻道hashcalc, d
20、ll 接口描述函數(shù)名:calc_crc32函數(shù):char* calc_crc32 (char *filename);參數(shù):文件名返回值:字符串說明:該函數(shù)對(duì)輸入的文件內(nèi)容進(jìn)行計(jì)算,并且返回它的crc32函數(shù)名:calc_md5函數(shù):char* cal c_md5 (char * filename);參數(shù):文件名返回值:字符串說明:該函數(shù)對(duì)輸入的文件內(nèi)容進(jìn)行計(jì)算,并且返回它的md5函數(shù)名:calc_shal函數(shù):char* calc_shal (char filename);參數(shù):文件名返回值:字符串說明:該函數(shù)對(duì)輸入的文件內(nèi)容進(jìn)行計(jì)算,并且返回它的sha1hashcalcadapter 代碼ilashcalcadapter. py 實(shí)現(xiàn)了一個(gè) python 的 class hashcalcadapter, hashcalcadapter 對(duì) hashtcalc. dl的c語言接口進(jìn)行了封裝,使得其他python模塊可以直接通過hashcalcadapter使用 hashtcalc. dll
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年電動(dòng)汽車技術(shù)考試試卷及答案
- 2025年城市公共設(shè)施管理知識(shí)測試卷及答案
- 物業(yè)客服個(gè)人工作總結(jié)
- 宴會(huì)廳音響設(shè)備調(diào)試標(biāo)準(zhǔn)
- 全膀胱切除術(shù)后造口護(hù)理
- 電力系統(tǒng)自動(dòng)化知識(shí)點(diǎn)習(xí)題集匯編
- 我身邊的英雄人物描寫13篇范文
- 2025年江西汽車駕駛員客運(yùn)資格證考試題及答案
- 網(wǎng)絡(luò)平臺(tái)內(nèi)容服務(wù)提供合同
- 旅游行業(yè)旅游資源管理練習(xí)題
- 農(nóng)機(jī)維修專業(yè)技能考試題及答案
- 《建筑業(yè)企業(yè)資質(zhì)等級(jí)標(biāo)準(zhǔn)》(建建200182號(hào))-20210829233
- 城市軌道交通車輛檢修工(中級(jí))技能鑒定考試題庫資料(含答案)
- 山東省煙臺(tái)市萊山區(qū)(五四制)八年級(jí)下學(xué)期期末數(shù)學(xué)試題(解析版)
- 一把手講安全課件:提升全員安全意識(shí)
- DB11T 1034.2-2024交通噪聲污染緩解工程技術(shù)規(guī)范 第2部分:聲屏障措施
- 四川省成都市金牛區(qū)2023-2024學(xué)年七年級(jí)下學(xué)期期末數(shù)學(xué)試題
- 人教版初中政治名言總結(jié)
- 湖北省武漢市青山區(qū) 2022-2023學(xué)年七年級(jí)下學(xué)期期末考試道德與法治試題
- 中華民族共同體概論課件專家版6第六講 五胡入華與中華民族大交融(魏晉南北朝)
- 白豆蔻提取物的藥理藥效學(xué)研究
評(píng)論
0/150
提交評(píng)論