参考:http://www.chineselinuxuniversity.net/articles/34844.shtml
http://simple-is-better.com/news/438
1、为什么需要python程序和c程序的整合
我们知道python是一种解释性的,面向对象的编程语言,支持多种平台,功能强大,简单但效率低;为了节省软件开发成本,
软件开发人员希望缩短软件的开发时间,希望在短时间内开发出稳定的产品。python功能强大,简单易用,能够快速开发应用软件。但由于python自身执行速度的局限性,
对性能要求比较高的模块要使用效率高的程序语言开发,如C语言,系统的其他模块则用python进行快速开发,最后将c语言模块和python模考进行整合。
2、整合python程序和C程序
2.1 利用ctypes模块整合python程序和C程序
ctypes 是 Python 的一个标准模块,它包含在 Python2.3 及以上的版本里。ctypes 是一个 Python 的高级外部函数接口,它使得 Python 程序可以调用 C 语言编译的静态链接库和动态链接库。运用 ctypes 模块,能够在 Python 源程序中创建,访问和操作简单的或复杂的 C 语言数据类型。最为重要的是 ctypes 模块能够在多个平台上工作,包括 Windows,Windows CE,Mac OS X,Linux,Solaris,FreeBSD,OpenBSD。
使用ctypes可以在python程序中定义类似C语言的变量。
下表列出了ctypes变量类型,C语言变量类型和python语言变量类型之间的关系
ctypes type c type Python type
c_char char 1-character string
c_wchar wchar_t 1-character unicode string
c_byte char int/long
c_ubyte unsigned char int/long
c_short short int/long
c_ushort unsigned short int/long
c_int int int/long
c_uint unsigned int int/long
c_long long int/long
c_ulong unsigned long int/long
c_longlong __int64 or long long int/long
c_ulonglong unsigned __int64 or unsigned long long int/long
c_float float float
c_double double float
c_char_p char * (NUL terminated) string or None
c_wchar_p wchar_t * (NUL terminated) unicode or None
c_void_p void * int/long or None
其中,第一列是ctypes库中定义的变量类型,第二列是C语言定义的变量类型,第三列是python不适用ctypes时定义的变量类型。
例2.1:ctypes简单使用
#!/usr/bin/python
from ctypes import *
#i=c_int(45)
i=c_int(45)
print i
print i.value
i.value=56
print i.value
运行输出:
shiyan@ubuntu:~/Desktop/study/pythonLearn$ ./ctypes_test.py
c_long(45)
45
56
例2.2 python调用C的动态链接库
用C语言写一个简单的动态链接库,如
int plus(int a,int b){
return a+b;
}
int minus(int a,int b){
return a-b;
}
将其编译成动态连接库(foo.so)
gcc foo.c -o foo.so -fPIC -shared
在同一目录下编写python脚本,代码如下:
#!/usr/bin/python
import ctypes
foo=ctypes.cdll.LoadLibrary("./foo.so") #加载动态链接库
#使用C中定义的函数
print foo.plus(1,2)
print foo.plus(100,-1)
print foo.minus(56,30)
print foo.minus(40,10)
运行输出:
shiyan@ubuntu:~/Desktop/study/pythonLearn$ ./python_foo.py
3
99
26
30