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语言变量类型之间的关系
第一列是在ctypes库中定义的变量类型,第二列是C语言定义的变量类型,第三列是Python语言在不使用ctypes时定义的变量类型。举例:
从下面的例子可以更明显地看出ctypes里的变量类型和C语言变量类型的相似性
下面例子说明了指针操作:
下面例子说明了结构和数组的操作:
Python访问C语言dll
通过ctypes模块,Python程序可以访问C语言编译的dll,本节通过一个简单的例子,Python程序helloworld.py中调用some.dll中的helloworld函数,来介绍Python程序如何调用windows平台上的dll。
导入动态链接库
访问动态链接库中的函数
整个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
导入动态链接库
访问动态链接库中的函数
整个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语言,既能够在加快开发速度的同时,也能够保证软件的运行性能。