ctypes是Python的一个标准模块,它包含在Python2.3及以上的版本里。ctypes是一个Python的高级外部函数接口,它使得Python程序可以调用C语言编译的静态链接库和动态链接库。运用ctypes模块,能够在Python源程序中创建,访问和操作简单的或复杂的C语言数据类型。

最为重要的是ctypes模块能够在多个平台上工作,包括Windows,WindowsCE,MacOSX,Linux,Solaris,FreeBSD,OpenBSD。接下来通过几个简单的例子来看一下ctypes模块如何整合Python程序和C程序。

 

源代码层面上的整合

利用Python本身提供的ctypes模块可以使Python语言和C语言在源代码层面上进行整合。本节介绍了如何通过使用ctypes库,在Python程序中可以定义类似C语言的变量。下表列出了ctypes变量类型,C语言变量类型和Python语言变量类型之间的关系

 

image

 

第一列是在ctypes库中定义的变量类型,第二列是C语言定义的变量类型,第三列是Python语言在不使用ctypes时定义的变量类型。举例:

 

image

 

从下面的例子可以更明显地看出ctypes里的变量类型和C语言变量类型的相似性

 

image

 

下面例子说明了指针操作:

 

image

 

下面例子说明了结构和数组的操作:

image

 

Python访问C语言dll

 

通过ctypes模块,Python程序可以访问C语言编译的dll,本节通过一个简单的例子,Python程序helloworld.py中调用some.dll中的helloworld函数,来介绍Python程序如何调用windows平台上的dll。

 

 

导入动态链接库

 

image

 

访问动态链接库中的函数

image

 

整个helloworld.py是这样的

fromctypesimportwindll  
defcallc():  
#loadthesome.dll  
somelibc=windll.LoadLibrary(some.dll)  
printsomelibc.helloworld()


if__name__== "__main__":  
callc()

 

在命令行运行helloworld.py,在console上可以看到some.dll中helloworld的输出

 

C:\>pythonC:\python\test\helloworld.py  
HelloWorld!Justasimpletest.

Python调用C语言so

通过ctypes模块,Python程序也可以访问C语言编译的so文件。与Python调用C的dll的方法基本相同,本节通过一个简单的例子,Python程序helloworld.py中调用some.so中的helloworld函数,来介绍Python程序如何调用linux平台上的so

 

导入动态链接库

image

访问动态链接库中的函数

image

整个helloworld.py是这样的:

 

 
def callc():  
	#loadthesome.so  
	somelibc=cdll.LoadLibrary(some.so)  
	printsomelibc.helloworld()
 
if__name__=="__main__":  
	callc()

 

 

在命令行运行helloworld.py,在linux标准输出上可以看到some.so中helloworld的输出。

 

[root@linux-790t]python./helloworld.py  
HelloWorld!Justasimpletest

 

 

总结

在软件开发过程中同时运用Python语言和C语言,既能够在加快开发速度的同时,也能够保证软件的运行性能。