一、Python與C/C++之間的溝通方法,除了Extending Python的方式外;在Python 2.5之後提供
ctype module可以直接在Python中使用CDLL方法(Method)來載入C/C++的動態連結資料庫(DLL)。
二、在不同的作業平台中利用ctype module來使用基本的C/C++的函式則必須載入想對應的C/C++ DLL:
2-1、Windows Platform: msvcrt.dll
2-2、 Linux Platform: libc.so.6
三、如何在Python中自訂與C/C++相同的資料結構(Data Structure)並進行資料的傳遞,其方法下列兩種:
3-1、直接定義:在class中直接定義完所需的欄位(Fields)
EX:class ClassName(Structure):
_fields_ = [("Field Name",File Type), …………]
3-2、間接定義:在class中不直接定義任何的欄位(Fields),而是在之後再進行定義。
EX:class ClassName(Structure):
pass
ClassName._fields_ = [("Field Name",File Type), …………]
PS:當自訂的結構欄位(field)必須使用本身自已做為其中欄位的類別時就必須使用間接定義的方法。
四、在Python中如何進行物件與指標之間的轉換,其方法如下:
4-1、當需要與C函式傳遞物件的指標時可以使用pointer method來取得該ctype object的指標。
EX: p = pointer(ctype object)
4-2、當C函式回傳給Python是一個指標時,可以使用cast函式將回傳的指標轉換成指定的結構指標。
EX: pstruct = cast(pointer,POINTER(type))
struct = pstruct.contents
五、範例說明:
5-1、使用C來建立一個串列(Link List)的動態連結資料庫(Dynamic Link List),
並自訂串列結構(The structure of Link List)。
5-1.1 InitList: 初始化串列的標頭(The Head of Link List)並回傳記憶體位址。
5-1.2 AddNode:在特定的串列(Link List)中新增一個節點(Node)。
5-1.3 DelNode:刪除特定串列(Link List)中的節點(Node)。
5-1.4 FindNode:在特定的串列中搜尋與輸入的值相符的節點並回傳該節點的位址。
5-1.5 PrintList:列出特定串列(Link List)中所有節點(Node)的內容值。
5-1.6 UninitList:釋放特定串列(Link List)持有的所有節點。
5-2、說明如何使用C來載入自訂的LinkList.dll並使用該DLL中定義的函式。
5-3、說明如何在Python中利用ctype module使用LinkList.dll中定義的函式。
Download: ctype.zip
Result:
ctype :
C/C++:
留言列表