python底层是用c写的,c本身是一个非常底层的语言,所以它做某些事情的效率肯定会比上层语言高一些。

比如有些自动化测试用的python库,会对系统的UI进行一些捕获,点击之类的操作,这必然要用到c,实际上这些库就是用c来扩展的。先用c写一些调用系统UI的接口,然后把它封装成python方法。

下面是一个简单的用C来扩展python的例子:

test.c

#include "Python.h"
static PyObject *pr_getsum(PyObject *self,PyObject *args)
{
int n,m;
if(!PyArg_ParseTuple(args,"ii",&n,&m))
return NULL;
return Py_BuildValue("i",m+n);
} static PyMethodDef PrMethods[]={
{"getsum",pr_getsum,METH_VARARGS,"get the sum"},
{NULL,NULL,,NULL}
}; void initpr(void)
{
(void) Py_InitModule("pr",PrMethods);
}

上面3个部分缺一不可,主要有:

1. 导出函数:需要注意的是PyArg_ParseTuple(args,"ii",&n,&m)) 这一句,表示python要传入的参数。

"i" 表示整数,"d"表示浮点数,“s"表示字符串。

要传入2个参数就写"ii","dd","is"等,也可以用多种选择"is|ii"表示第一个参数是整数,第二个可以是字符串或整数

2. 方法列表:PyMethodDef的成员一次表示"方法名,导出函数,参数传递方式,方法描述“

3. 初始化函数:必须以init开头

然后是编写setup.py文件,与上面的test.c文件在一个目录下

from distutils.core import setup,Extension

module = Extension('pr',sources=['test.c'])
setup(name='pr test',version='1.0',ext_modules=[module])

然后执行命令就可以了

python setup.py build

结束后可以看到生成了一个build目录,里面会有2个文件test.o和pr.so。我们需要用到的是pr.so文件。

可以把pr.so文件放到python的site_packages目录下,或者把pr.so所在的目录添加到sys.path里,就可以在python里直接调用了

import pr
print pr.getsum(2,3)

需要注意的是,在windows上运行python setup.py build的时候可能会报错error: Unable to find vcvarsall.bat。 这个就自己在google上搜下解决方法吧,linux和mac上应该是可以直接运行的。

使用ctypes调用c语言函数

还是上面的例子,我们要求2个数的和。那么在windows上可以这样写

__declspec(dllexport) int
add(int num1, int num2)
{
return num1 + num2;
}

然后是把这个文件编译成动态链接库,这时候需要用到cl命令

cl命令需要安装visual studio,如果已经安装了请按这个方法来配置环境变量http://hi.baidu.com/xiaoma/item/94c649dc4bc5dae3795daac2

然后运行

cl -LD test.c -o test.dll

可以在当前目录下生成一个test.dll文件,这个就是我们要用的。

然后在python文件里就可以直接使用了

from ctypes import *

def main():
libtest = cdll.LoadLibrary('test.dll')
print libtest.add(2,3) if __name__ == '__main__':
main()

这个方法在macos x上貌似不行,有待考究

使用C语言扩展Python提供性能的更多相关文章

  1. C语言扩展Python模块

    1. 先创建一个PythonDemo.cpp文件: //c/c++中调用python脚本,配置步骤参见上一篇:C/C++与python交互 \  C/C++中调用python文件. #include ...

  2. 使用C语言扩展Python

    开发环境:Ubuntu9.10,python2.6,gcc4.4.1 1,ubuntu下的python运行包和开发包是分开的,因此需要在新利得里面安装python-all-dev,从而可以在代码中引用 ...

  3. 用C语言扩展Python的功能

    https://www.ibm.com/developerworks/cn/linux/l-pythc/

  4. windows 下 使用codeblocks 实现C语言对python的扩展

    本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展 ...

  5. 使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments

    使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python ...

  6. 扩展Python模块系列(三)----参数解析与结果封装

    在上一节中,通过一个简单的例子介绍了C语言扩展Python内建模块的整体流程,从本节开始讲开始深入讨论一些细节问题,在细节讨论中从始至终都会涉及[引用计数]的问题.首先讨论C语言封装的Python函数 ...

  7. 扩展Python模块系列(二)----一个简单的例子

    本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...

  8. 扩展Python模块系列(四)----引用计数问题的处理

    承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最 ...

  9. 扩展Python模块系列(五)----异常和错误处理

    在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_ ...

随机推荐

  1. python json 序列化任意数据类型

    json默认支持的数据类型 +-------------------+---------------+ | Python | JSON | +===================+========= ...

  2. Angular2 初识

    AppComponent 壳的三个实现文件: app.component.ts— 组件的类代码,这是用 TypeScript 写的. app.component.html— 组件的模板,这是用 HTM ...

  3. iOS-tableView会卡顿

    其实影响tableView卡顿的因素有很多,我也就其中一些常见的问题来说一下. 在tableView里的tableViewCell中使用许多图片的时候,而且我们大量使用的是 xxx.clipsToBo ...

  4. Visual Studio 2010 如何改用 Beyond Compare 作为 TFS 的比较工具

    Beyond Compare 是一套非常实用的文件及文件夹比较软件,不仅可以快速比较出两个文件夹的不同之处,还可以详细的比较文件之间的内容差异.最近改用 TFS 进行版本控管之后,说实在的还是习惯使用 ...

  5. Intellij IDEA Ultimate Edition 14.1 破解

    key:IDEA value:61156-YRN2M-5MNCN-NZ8D2-7B4EW-U12L4 (2) key:huangwei value:97493-G3A41-0SO24-W57LI-Y2 ...

  6. Powered by Flink

    Apache Flink: Powered by Flink https://flink.apache.org/poweredby.html Powered by Flink Apache Flink ...

  7. MQ中间件对比

  8. 【我的Android进阶之旅】 Android Studio插件之Jenkins插件介绍

    一Jenkins插件功能介绍 1Jenkins任务列表 2切换Jenkins分组 3构建Jenkins任务 4进入构建Jenkins任务的页面 5进入最后一次构建Jenkins任务的页面 6增加Jen ...

  9. swift 值得学习的项目

    http://www.php100.com/html/it/biancheng/2015/0112/8329.html

  10. struts 多文件上传 annotation注解(零配置)+ ajaxfileupload + 异步 版本

    [本文简介] struts 多文件上传.基于”零配置“+"ajaxfileupload" 的一个简单例子. [导入依赖jar包] jquery-1.7.2.js : http:// ...