用C语言编写Python扩展模块
2013-05-06 10:21
316 查看
http://blog.tianya.cn/blogger/post_read.asp?BlogID=3616841&PostID=36654684
作为脚本语言,Python也有执行效率不高的缺点,不过可以用Python写框架,用C去实现具体的功能,一方面兼顾了运行效率,另一方面也提高了开发速度。闲话少说,下面介绍一下如何用C编写Python的扩展模块。
编写扩展分为两个部分,首先编写Python的接口代码,对C代码进行包装,其次对代码进行编写,生成可被Python调用的模块。
编写接口代码主要分为四步:
1. 包含Python的头文件
2. 为每个模块的每一个函数增加一个型如PyObject* Module_func()的包装函数。
3. 为每个模块增加一个型如PyMethodDef ModuleMethods[]的数组。
4. 增加模块初始化函数void initModule()
首先建立一个名字为mym.c的文件,文件中定义了一个func函数:
#include "Python.h"
double func(double x,double y)
{
return x+y;
}
/*对函数进行包装,每一个Python对象在C中都是PyObject* 类型*/
static PyObject *mym_func(PyObject *self,PyObject *args)
{
double arg1, arg2, result;
if (!PyArg_ParseTuple(args,"dd",&arg1,&arg2))
{
return NULL;
}
result = func(arg1,arg2);
return Py_BuildValue("d",result);
}
/* 建立一个模块函数的列表*/
static PyMethodDef mymMethods[] =
{
{"func",mym_func,METH_VARARGS},
{NULL,NULL,0,NULL}
};
/* 对模块进行初始化*/
void initmym()
{
Py_InitModule("mym",mymMethods);
}
函数的包装完成后,用distutils模块对包进行编译,下面建立编译的脚本:
from distutils.core import setup, Extension
module1 = Extension(name='mym', sources = ['mym.c'])
setup (name = 'mym', version = '1.0', description = 'This is a demo package', ext_modules = [module1])
将setup.py和mym.c放在同一个目录下,在windows下我们用mingw32进行编译,进入文件目录,输入编译命令:
python setup.py build -c mingw32
这样会在当前目录中生成一个build文件夹,文件夹中包含一个lib.win32-2.x的文件夹,在lib.win32-2.x中会生成mym.pyd的文件,这个文件就是我们最终需要的python模块,将其放到python的安装目录中,在解释器中输入
import mym
如果没有出错提示,那么恭喜,我们成功编写了一个Python扩展模块。
作为脚本语言,Python也有执行效率不高的缺点,不过可以用Python写框架,用C去实现具体的功能,一方面兼顾了运行效率,另一方面也提高了开发速度。闲话少说,下面介绍一下如何用C编写Python的扩展模块。
编写扩展分为两个部分,首先编写Python的接口代码,对C代码进行包装,其次对代码进行编写,生成可被Python调用的模块。
编写接口代码主要分为四步:
1. 包含Python的头文件
2. 为每个模块的每一个函数增加一个型如PyObject* Module_func()的包装函数。
3. 为每个模块增加一个型如PyMethodDef ModuleMethods[]的数组。
4. 增加模块初始化函数void initModule()
首先建立一个名字为mym.c的文件,文件中定义了一个func函数:
#include "Python.h"
double func(double x,double y)
{
return x+y;
}
/*对函数进行包装,每一个Python对象在C中都是PyObject* 类型*/
static PyObject *mym_func(PyObject *self,PyObject *args)
{
double arg1, arg2, result;
if (!PyArg_ParseTuple(args,"dd",&arg1,&arg2))
{
return NULL;
}
result = func(arg1,arg2);
return Py_BuildValue("d",result);
}
/* 建立一个模块函数的列表*/
static PyMethodDef mymMethods[] =
{
{"func",mym_func,METH_VARARGS},
{NULL,NULL,0,NULL}
};
/* 对模块进行初始化*/
void initmym()
{
Py_InitModule("mym",mymMethods);
}
函数的包装完成后,用distutils模块对包进行编译,下面建立编译的脚本:
from distutils.core import setup, Extension
module1 = Extension(name='mym', sources = ['mym.c'])
setup (name = 'mym', version = '1.0', description = 'This is a demo package', ext_modules = [module1])
将setup.py和mym.c放在同一个目录下,在windows下我们用mingw32进行编译,进入文件目录,输入编译命令:
python setup.py build -c mingw32
这样会在当前目录中生成一个build文件夹,文件夹中包含一个lib.win32-2.x的文件夹,在lib.win32-2.x中会生成mym.pyd的文件,这个文件就是我们最终需要的python模块,将其放到python的安装目录中,在解释器中输入
import mym
如果没有出错提示,那么恭喜,我们成功编写了一个Python扩展模块。
相关文章推荐
- 【Python】用C语言编写Python模块
- 用C语言实现python的扩展模块
- C语言实现的Python扩展模块
- C语言扩展Python模块
- 利用C++ Boost编写扩展Python模块
- 通过SWIG用C语言编写Python扩展
- 利用C++ Boost编写扩展Python模块
- 在python中扩展c语言模块
- Python的C扩展模块的编写(Anaconda+VS2013,python3.5和c++)
- 用C语言实现python的扩展模块
- 扩展Python__在python脚本中使用其他语言(c/c++/java/c#)编写的模块
- 【Python】使用C语言来扩展Python模块
- C语言实现的Python扩展模块(兼容Python2 & 3)
- 在python中使用c语言扩展模块的简单示例
- 使用C语言编写Python扩展——创建自定义类型(1)
- 怎样编写python脚本的C扩展模块
- 使用C语言编写Python扩展1——Hello World
- 使用C语言编写Python扩展——创建自定义类型(2)
- 利用C++ Boost编写扩展Python模块
- C语言实现的Python扩展模块