成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

加速程序開發 Python整合C語言模塊

開發 后端 前端
本文通過實例研究如何在Python程序中整合既有的C語言模塊,包括用C語言編寫的源程序和動態鏈接庫等,從而充分發揮Python語言和C語言各自的優勢。

Python是一種用于快速開發軟件的編程語言,它的語法比較簡單,易于掌握,但存在執行速度慢的問題,并且在處理某些問題時存在不足,如對計算機硬件系統的訪問,對媒體文件的訪問等。而作為軟件開發的傳統編程語言C語言,卻能在這些問題上很好地彌補Python語言的不足。

51CTO推薦閱讀:專訪豆瓣網***架構師洪強寧:Python,簡單的力量

概覽

Python是一種用于快速開發軟件的編程語言,它的語法比較簡單,易于掌握,但存在執行速度慢的問題,并且在處理某些問題時存在不足,如對計算機硬件系統的訪問,對媒體文件的訪問等。而作為軟件開發的傳統編程語言——C語言,卻能在這些問題上很好地彌補Python語言的不足。因此,本文通過實例研究如何在Python程序中整合既有的C語言模塊,包括用C語言編寫的源程序和動態鏈接庫等,從而充分發揮Python語言和C語言各自的優勢。

Python語言的特點

Python作為一門程序開發語言,被越來越多地運用到快速程序開發。Python是一種解釋型的,互動的,面向對象的編程語言,它包含了模塊化的操作,異常處理,動態資料形態,以及類型的使用。它的語法表達優美易讀,具有很多優秀的腳本語言的特點:解釋的,面向對象的,內建的高級數據結構,支持模塊和包,支持多種平臺,可擴展。而且它還支持交互式方式運行,圖形方式運行。它擁有眾多的編程界面支持各種操作系統平臺以及眾多的各類函數庫,利用C和C++可以對它進行擴充。

C語言的特點

C語言作為最受人們歡迎的語言之一,有廣泛的發展基礎。簡潔緊湊、靈活方便,功能強大是其特點。另外,C語言是一門中級語言。它把高級語言的基本結構和語句與低級語言的實用性結合起來。由于可以直接訪問物理地址,可以方便的對硬件進行操作。因此,很多的系統軟件都是由C語言編寫。

Python語言與C語言的交互

為了節省軟件開發成本,軟件開發人員希望能夠縮短的軟件的開發時間,希望能夠在短時間內開發出穩定的產品。Python功能強大,簡單易用,能夠快速開發應用軟件。但是由于Python自身執行速度的局限性,對性能要求比較高的模塊需要使用效率更高的程序語言進行開發。

例如C語言,系統的其他模塊運用Python進行快速開發,***將C語言開發的模塊與Python開發的模塊進行整合。在此背景下,基于Python語言與C語言的各自特點,用C語言來擴展現有的Python程序,顯得很有意義。本文首先介紹幾種常用的整合Python程序與C語言程序的方法,***給出相應的實例。

利用ctypes模塊整合Python程序和C程序

ctypes模塊

ctypes是Python的一個標準模塊,它包含在Python2.3及以上的版本里。ctypes是一個Python的高級外部函數接口,它使得Python程序可以調用C語言編譯的靜態鏈接庫和動態鏈接庫。運用ctypes模塊,能夠在Python源程序中創建,訪問和操作簡單的或復雜的C語言數據類型。

最為重要的是ctypes模塊能夠在多個平臺上工作,包括Windows,WindowsCE,MacOSX,Linux,Solaris,FreeBSD,OpenBSD。接下來通過幾個簡單的例子來看一下ctypes模塊如何整合Python程序和C程序。

#p#

源代碼層面上的整合

利用Python本身提供的ctypes模塊可以使Python語言和C語言在源代碼層面上進行整合。本節介紹了如何通過使用ctypes庫,在Python程序中可以定義類似C語言的變量。下表列出了ctypes變量類型,C語言變量類型和Python語言變量類型之間的關系:

表1.ctypes,c語言和Python語言變量類型關系 
表1.ctypes,c語言和Python語言變量類型關系

表1中的***列是在ctypes庫中定義的變量類型,第二列是C語言定義的變量類型,第三列是Python語言在不使用ctypes時定義的變量類型。舉例:

  1. 清單1.ctypes簡單使用  
  2. >>>fromctypesimport*#導入ctypes庫中所有模塊  
  3. >>>i=c_int(45)#定義一個int型變量,值為45  
  4. >>>i.value#打印變量的值  
  5. 45  
  6. >>>i.value=56#改變該變量的值為56  
  7. >>>i.value#打印變量的新值  
  8. 56 

從下面的例子可以更明顯地看出ctypes里的變量類型和C語言變量類型的相似性:

  1. 清單2.ctypes使用C語言變量  
  2. >>>p=create_string_buffer(10)#定義一個可變字符串變量,長度為10  
  3. >>>p.raw#初始值是全0,即C語言中的字符串結束符’\0’  
  4. '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'  
  5. >>>p.value="Student"#字符串賦值  
  6. >>>p.raw#后三個字符仍是’\0’  
  7. 'Student\x00\x00\x00'  
  8. >>>p.value="Big"#再次賦值  
  9. >>>p.raw#只有前三個字符被修改,第四個字符被修改為’\0’  
  10. 'Big\x00ent\x00\x00\x00' 

下面例子說明了指針操作:

  1. 清單3.ctypes使用C語言指針  
  2. >>>i=c_int(999)#定義int類型變量i,值為999  
  3. >>>pi=pointer(i)#定義指針,指向變量i  
  4. >>>pi.contents#打印指針所指的內容  
  5. c_long(999)  
  6. >>>pi.contents=c_long(1000)#通過指針改變變量i的值  
  7. >>>pi.contents#打印指針所指的內容  
  8. c_long(1000) 

下面例子說明了結構和數組的操作:

  1. 清單4.ctypes使用C語言數組和結構體  
  2. >>>classPOINT(Structure):#定義一個結構,內含兩個成員變量x,y,均為int型  
  3. ..._fields_=[("x",c_int),  
  4. ...("y",c_int)]  
  5. ...  
  6. >>>point=POINT(2,5)#定義一個POINT類型的變量,初始值為x=2,y=5 
  7. >>>printpoint.x,point.y#打印變量  
  8. 25  
  9. >>>point=POINT(y=5)#重新定義一個POINT類型變量,x取默認值  
  10. >>>printpoint.x,point.y#打印變量  
  11. 05  
  12. >>>POINTPOINT_ARRAY=POINT*3#定義POINT_ARRAY為POINT的數組類型  
  13. #定義一個POINT數組,內含三個POINT變量  
  14. >>>pa=POINT_ARRAY(POINT(7,7),POINT(8,8),POINT(9,9))  
  15. >>>forpinpa:printp.x,p.y#打印POINT數組中每個成員的值  
  16. ...  
  17. 77  
  18. 88  
  19. 99 

#p#

Python訪問C語言dll

通過ctypes模塊,Python程序可以訪問C語言編譯的dll,本節通過一個簡單的例子,Python程序helloworld.py中調用some.dll中的helloworld函數,來介紹Python程序如何調用windows平臺上的dll。

導入動態鏈接庫

  1. 清單5.ctypes導入dll  
  2. fromctypesimportwindll#首先導入ctypes模塊的windll子模塊  
  3. somelibc=windll.LoadLibrary(some.dll)#使用windll模塊的LoadLibrary導入動態鏈接庫 

訪問動態鏈接庫中的函數

  1. 清單6.ctypes使用dll中的函數  
  2. somelibc.helloworld()#這樣就可以得到some.dll的helloworld的返回值 

整個helloworld.py是這樣的:

  1. 清單7.Pythonhellpworld代碼  
  2. fromctypesimportwindll  
  3. defcallc():  
  4. #loadthesome.dll  
  5. somelibc=windll.LoadLibrary(some.dll)  
  6. printsomelibc.helloworld()  
  7. if__name__==“__main__”:  
  8. callc() 

在命令行運行helloworld.py,在console上可以看到some.dll中helloworld的輸出。

  1. 清單8.PythonhellpworldWindowscommandconsole運行輸出  
  2. C:\>pythonC:\python\test\helloworld.py  
  3. HelloWorld!Justasimpletest. 

Python調用C語言so

通過ctypes模塊,Python程序也可以訪問C語言編譯的so文件。與Python調用C的dll的方法基本相同,本節通過一個簡單的例子,Python程序helloworld.py中調用some.so中的helloworld函數,來介紹Python程序如何調用linux平臺上的so。

導入動態鏈接庫

  1. 清單9.ctypes導入so  
  2. fromctypesimportcdll  
  3. #首先導入ctypes模塊的cdll子模塊,注意linux平臺上使用cdll的,而不是windll。  
  4. somelibc=cdll.LoadLibrary(“./some.so”)  
  5. #使用cdll模塊的LoadLibrary導入動態鏈接庫 

訪問動態鏈接庫中的函數

  1. 清單10.ctypes使用so中的函數  
  2. somelibc.helloworld()#使用方法與windows平臺上是一樣的 

整個helloworld.py是這樣的:

  1. 清單11.Pythonhelloworld代碼  
  2. fromctypesimportcdll  
  3. defcallc():  
  4. #loadthesome.so  
  5. somelibc=cdll.LoadLibrary(some.so)  
  6. printsomelibc.helloworld()  
  7. if__name__==“__main__”:  
  8. callc() 

在命令行運行helloworld.py,在linux標準輸出上可以看到some.so中helloworld的輸出。

  1. 清單12.PythonhellpworldLinuxshell運行輸出  
  2. [root@linux-790t]python./helloworld.py  
  3. HelloWorld!Justasimpletest. 

#p#

Python程序和C程序整合實例

以下我們舉例用Python來實現一個小工具,用來實現hash算法,查看文件的校驗和(MD5,CRC,SHA1等等)。通過查看文件的校驗和,可以知道文件在傳輸過程中是否被破壞或篡改。

Hash,一般翻譯做“散列”,也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射,pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。

由于相對C語言來說,Python的運行效率較低,因此我們的Python小工具利用一個已有的C語言的動態鏈接庫(hashtcalc.dll)來實現我們的程序。本例中,我們運用wxPython編寫簡單的GUI界面,通過python調用hashtcalc.dll的接口計算文件的校驗和,然后輸出在界面上。

架構圖

圖1.工具的架構圖 
圖1.工具的架構圖

hashcalc.dll接口描述

函數名:calc_CRC32

函數:char*calc_CRC32(char*filename);

參數:文件名

返回值:字符串

說明:該函數對輸入的文件內容進行計算,并且返回它的CRC32

函數名:calc_MD5

函數:char*calc_MD5(char*filename);

參數:文件名

返回值:字符串

說明:該函數對輸入的文件內容進行計算,并且返回它的MD5

函數名:calc_SHA1

函數:char*calc_SHA1(char*filename);

參數:文件名

返回值:字符串

說明:該函數對輸入的文件內容進行計算,并且返回它的SHA1

HashcalcAdapter代碼

HashcalcAdapter.py實現了一個python的classHashcalcAdapter,HashcalcAdapter對hashtcalc.dl的C語言接口進行了封裝,使得其他python模塊可以直接通過HashcalcAdapter使用hashtcalc.dll中實現的hash算法。具體的代碼如下:

  1. 清單13.HashcalcAdapter.py代碼  
  2. fromctypesimportwindll  
  3. fromctypesimport*  
  4. classHashcalcAdapter(object):  
  5. def__init__(self,dllpath):  
  6. self._dllpath=dllpath  
  7. self._libc=windll.LoadLibrary(self._dllpath)  
  8.  
  9. defcalc_CRC32(self,filename):  
  10. new_filename=c_char_p(filename)  
  11. returnself._libc.calc_CRC32(new_filename)  
  12.  
  13. defcalc_MD5(self,filename):  
  14. new_filename=c_char_p(filename)  
  15. returnself._libc.calc_MD5(new_filename)  
  16.  
  17. defcalc_SHA1(self,filename):  
  18. new_filename=c_char_p(filename)  
  19. returnself._libc.calc_SHA1(new_filename) 

運行界面

圖2.工具的運行界面 
圖2.工具的運行界面

總結

在軟件開發過程中同時運用Python語言和C語言,既能夠在加快開發速度的同時,也能夠保證軟件的運行性能。

【編輯推薦】

  1. 專訪豆瓣網***架構師洪強寧:Python,簡單的力量
  2. Python作用域的實際操作步驟的相關介紹
  3. 對Python特色的詳細介紹
  4. Python嵌入C實例的相關具體解析 
責任編輯:王曉東 來源: IBM
相關推薦

2012-06-08 17:58:48

安全加速Check Point

2012-02-08 15:06:31

ibmdw

2009-09-24 17:21:17

加速Hibernate

2023-08-17 20:13:42

2019-05-24 16:20:11

Python 開發編程語言

2009-08-13 17:04:09

C#語言C#程序

2009-01-16 08:57:58

GCCC編譯

2011-05-13 15:54:50

C模塊化

2009-06-15 11:03:10

Java語言C#語言

2010-03-25 18:13:06

Python編程語言

2010-01-22 11:23:06

C++程序

2010-02-24 14:27:25

Python模塊語言

2013-07-04 13:19:24

Java開發速度

2011-05-17 14:53:35

C

2010-01-20 09:14:49

C語言模塊化

2011-05-13 15:46:49

C模塊化

2009-09-03 17:42:07

C#開發CF藍牙模塊

2010-08-02 09:10:36

Flex模塊化

2009-08-21 15:40:26

Linux KerneLinux開發加速

2009-09-02 17:08:30

C#語言開發Windo
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线视频日韩精品 | 欧美日韩久久 | 久久精品久久精品久久精品 | 久久天堂 | 日韩欧美精品 | 中文字幕亚洲视频 | av网站在线看 | 综合视频在线 | 国产精品色 | 福利网址 | 2019精品手机国产品在线 | 中文字幕一区二区三区不卡在线 | 亚洲精品一区二区在线 | 免费久草| 成人av电影在线 | 国产福利在线看 | h视频在线免费看 | 成人妇女免费播放久久久 | www久久爱| 亚洲大片| 久久久精品影院 | 国产午夜精品视频 | 久久成人精品视频 | 国产乱码精品一区二区三区中文 | 亚洲一区免费视频 | 亚洲精品黄色 | 国产免费一区二区三区免费视频 | 欧美成年人视频在线观看 | av入口 | 成人精品鲁一区一区二区 | 亚洲福利在线视频 | 国产区第一页 | 国产精品96久久久久久 | 欧美 日韩 国产 一区 | 日韩福利片 | 一区二区三区视频 | 97色在线观看免费视频 | 亚洲视频一区二区三区 | 日韩欧美专区 | 久久久久成人精品 | 中文字幕免费视频 |