標籤:基本類型 讀寫檔案 方式 特性 跨平台 類型轉換 mss 介紹 映射
一: 模組介紹
模組ctypes是Python內建的用於調用動態連結程式庫函數的功能模組,一定程度上可以用於Python與其他語言的混合編程。由於編寫動態連結程式庫,使用C/C++是最常見的方式,故ctypes最常用於Python與C/C++混合編程之中。
二:ctypes 的原理以及優缺點
從ctypes的文檔中可以推斷,在各個平台上均使用了對應平台動態載入動態連結程式庫的方法,並通過一套類型映射的方式將Python與二進位動態連結程式庫相串連。通過閱讀ctypes本身的代碼也可以印證這個推斷(/Modules/_ctypes/_ctypes.c和/Modules/_ctypes/callproc.c)。在Windows平台下,最終調用的是Windows API中LoadLibrary函數和GetProcAddress函數,在Linux和Mac OS X平台下,最終調用的是Posix標準中的dlopen和dlsym函數。ctypes 實現了一系列的類型轉換方法,Python的資料類型會封裝或直接推算為C類型,作為函數的調用參數;函數的傳回值也經過一系列的封裝成為Python類型。也就是說,PyObject* <-> C types的轉換是由ctypes內部完成的,這和SWIG是同一個原理。
從ctypes的實現原理不難看出:
ctypes 有以下優點:
- Python內建,不需要單獨安裝
- 可以直接調用二進位的動態連結程式庫
- 在Python一側,不需要瞭解Python內部的工作方式
- 在C/C++一側,也不需要瞭解Python內部的工作方式
- 對基本類型的相互映射有良好的支援
ctypes 有以下缺點:
- 平台相容性差
- 不能夠直接調用動態連結程式庫中未經匯出的函數或變數
- 對C++的支援差
就個人的經驗來看,ctypes 適合於“中輕量級”的Python C/C++混合編程。特別是遇到第三方庫提供動態連結程式庫和調用文檔,且沒有編譯器或編譯器並不互相相容的場合下,使用ctypes特別方便。值得注意的是,對於某種需求,在Python本身就可以實現的情況下(例如擷取系統時間、讀寫檔案等),應該優先使用Python自身的功能而不要使用作業系統提供的API介面,否則你的程式會喪失跨平台的特性。
三:使用舉例
linux下測試:hello word
#include<stdio.h>int main(){printf("Hello World!");return 1;}
這裡只有一個main函數,注意:gcc(Linux和Mac OS X的預設編譯器)下,所有函數預設均匯出,windows需要
接下來把它編譯為動態連結程式庫。Windows下動態連結程式庫的副檔名是dll,Linux下是so,Mac OS X下是dylib。這裡為了方便起見,一律將副檔名設定為dll。
Windows GCC、Linux、Mac OS X下編譯命令相同:
gcc -fPIC -shared -msse4.2 hello.c -o hello.dll #或者為hello.so
使用python來調用:
>>> from ctypes import *
>>>mm = cdll.LoadLibrary(‘hello.dll‘)##或者為hello.so,
>>> mm.main()
hello world!1
------------------------
more:
http://www.cnblogs.com/ryhan/p/6056316.html
Python ctypes 模組