使用C语言扩展Python提供性能

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,0,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上貌似不行,有待考究

时间: 2024-10-11 05:55:00

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

转:用C语言扩展Python的功能

转自:http://www.ibm.com/developerworks/cn/linux/l-pythc/ 一.简介 Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中. 与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C++来对Python进行功能性扩展,从而即可以利用Python方便灵活

【转】用C语言扩展Python的功能

原作者:肖文鹏 ([email protected]),原文地址:http://www.ibm.com/developerworks/cn/linux/l-pythc/ Pyton和C分别有着各自的优缺点,用Python开发程序速度快,可靠性高,并且有许多现成模块可供使用,但执行速度相对较慢:C语言则正好相反,其执行速度快,但开发效率低.为了充分利用两种语言各自的优点,比较好的做法是用Python开发整个软件框架,而用C语言实现其关键模块.本文介绍如何利用C语言来扩展Python的功能,并辅以具

使用C语言扩展Python

开发环境:Ubuntu9.10,python2.6,gcc4.4.1 1,ubuntu下的python运行包和开发包是分开的,因此需要在新利得里面安装python-all-dev,从而可以在代码中引用python的头文件和库. 2.下面是一个最简单的可以供python调用的c扩展模块,假设c程序文件名为foo.c: 代码 #include <Python.h> static PyObject* foo_bar(PyObject* self, PyObject* args) {    Py_RE

用C语言扩展Python

最近一直在跟随<PYTHON核心编程>学习一些python的编写,可惜的是这本书的版本太过于陈旧.大部分范例代码都是python2的版本. 刚刚在看python用C语言写扩展包的时候踩到了一个大坑,到现在没用爬上来 跟其他的python代码一样,扩展包也无非就是调包而已,要把python的数据类型转换成C语言能够兼容的数据类型, 通过C程序进行运算后,再返回成python自己的数据类型. 这里在写C程序的时候需要用到Python.h的头文件.这个一般在python所在的文件夹下. 我直接暴力拷

初用C/C++扩展Python,提高性能

前段时间写了两篇文章介绍如何提高Python的运行效率,一篇是从python语言本身的角度去介绍的,另一篇是从解释器角度(利用PyPy),有兴趣的可以找着看看.从另外一个角度来介绍如何提高python运行效率,那就是利用c/c++来扩展python提高性能.我们知道python官方网站上下载的python解释器源码是用c语言编写的,所以,也可以利用c/c++来扩展它,以获得较优的执行性能.Python提供了API接口,是我们很方便的能进行扩展,所有这些API都包含在Python.h的头文件里,在

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

本人比较懒就粘一下别人的配置方案了 从这开始到代码 摘自http://blog.csdn.net/yueguanghaidao/article/details/11538433 一直对Python扩展很感兴趣,刚好看到了Extending and Embedding the Python Interpreter文档,看的是最低版本(由于工作中用的是2.x, ̄□ ̄),官方文档 链接:http://docs.python.org/2.6/extending/index.html 我使用的IDE是Co

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

使用C++扩展Python的功能 环境 VS2005Python2.5.4 Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是一样的).而是指使用Python本身提供的API,使用C++来对Python进行功能性扩展,可以这样理解,使用更高效的语言实现一些算法计算等等需要更高执行效率的核心(或者需要与系统进行密切交互的)模块,然后让Python像调用内建标准库的方式来调用这些模块,听起来是不是很

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

在上一节中,讨论了在用C语言扩展Python模块时,应该如何处理无处不在的引用计数问题.重点关注的是在实现一个C Python的函数时,对于一个PyObject对象,何时调用Py_INCREF和Py_DECREF.在编写C语言代码时,需要了解Python提供的C/C++ API的实现细节,特别是有的API内部实现会调用Py_INCREF,这时自己编写的函数可能需要调用Py_DECREF,而有的API内部实现只是borrowed reference,此时一般不应该调用Py_DECREF. 本节讨论

Python:C语言扩展

1. 概述 Python 可以非常方便地和 C 进行相互的调用. 一般,我们不会使用 C 去直接编写一个 Python 的模块.通常的情景是,我们需要把 C 的相关模块包装一下,然后在 Python 中可以直接调用它.或者是,把 Python 逻辑中的某一效率要求很高的部分使用 C 来实现.整个过程大概是: 引入 Python.h 头文件. 编写包装函数. 函数中处理从 Python 传入的参数. 实现功能逻辑. 处理 C 中的返回值,包装成 Python 对象. 在一个 PyMethodDef