python程序和c程序的结合

参考: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





  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值