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. window 实用操作(结束已打开无法删除进程 内存占用)

    1.win7删除文件,文件夹或文件已在另一程序中打开:https://jingyan.baidu.com/article/e75057f2a41e88ebc91a8985.html 删除文件时,提示“ ...

  2. std::stringstream(2)

    stringstream本身的复制构造函数是私有的,无法直接用,于是带来了一些复杂的问题 网上,流传着几种办法,如streamA.str(streamB.str()),但这种办法,复制的仅仅是初始化时 ...

  3. 【BZOJ4552】[Tjoi2016&Heoi2016]排序 二分+线段树

    [BZOJ4552][Tjoi2016&Heoi2016]排序 Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ...

  4. mysql出现) Notice: Trying to get property of non-object in E:\p错误的 原因

    在mysql中,每个命令之间都要留一点空格 如果是这样, $query = "select * from books where " .$searchtype. "lik ...

  5. js中的typeof name

    js中的name 使用typeof name得到  string.. 因为name是全局变量,可以在任意浏览器中使用 . cosole.dir(window)查看.. console.log(type ...

  6. Android 点击电话号码之间拨号

    点击电话号码之间拨打电话,可用通过下面的方式实现: 假设电话号码以TextView的方式显示 1.Intent方式 在TextView的响应事件中 : String phone = tvphone.g ...

  7. FFMPEG推流到RTMP服务器命令 - weixin_37897683的博客 - CSDN博客 https://blog.csdn.net/weixin_37897683/article/details/81225228

    FFMPEG推流到RTMP服务器命令 - weixin_37897683的博客 - CSDN博客 https://blog.csdn.net/weixin_37897683/article/detai ...

  8. office 2013 activiate---(run as admin)

    win7 office 2013 activiate---(run as admin) empty the garbage in osx rm -rf ~/.Trash

  9. time/datetime/random/string/os/sys/shutil/zipfile/tarfile - 总结

    time 模块: time.time() #时间戳 time.localtime() #当前时间对象元组 time.localtime(123123) #根据时间戳的时间对象 time.mktime( ...

  10. Spring 框架的 applicationContext.xml 配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...