一: 模塊介紹
模塊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