Python ctypes 模塊


一: 模塊介紹

  模塊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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM