怎样编写python脚本的C扩展模块

引用 http://blog.csdn.net/oldsmith/article/details/3628282

/*demo.c   module spam*/

#include <Python.h>
static PyObject * spam_system(PyObject * self,PyObject * args)
{
    char *command;
    int        sts;
    //解析传进来的参数 “s”表示解析为字符串
    if(!PyArg_ParseTuple(args,"s",&command))
        return NULL;
    sts = system(command);
    //Py_BuildValue()是用来Python对象,返回Python*
    return Py_BuildValue("i",sts);
}

static    PyMethodDef    SpamMethods[] = {
    //表格说明
    //列 1 :表示python中函数的名字,这里是system,在python中可以通过spam.system来调用这个函数
    //列 2 :一个函数指针,spam_system,这个函数原型一定是 static PyObject *   fun(PyObject * self,PyObject * args)
    //列 3 :是一个宏(macro),表示函数类型。从C语言的来看,Python中的函数有两种,一种是常用的用tuple来传递参数,
    //    一般是METH_VARARGS表示,一种是dictionary传递参数,叫做keyword parameter,用METH_VARARGS|METH_KEYWORDS
    //    这个两个macro就分别对应这两种函数。两种方式在C语言中对应的函数原型是不一样的。
    //列 4 :是一个doc string,在python可以spam.system.__doc__得到
    {"system",spam_system,METH_VARARGS,"Excute a shell command."},
    {NULL,NULL,0,NULL}    //表格结束

};

//当在Python脚本使用import的时候会调用这个函数,这个是唯一的非静态函数
//名字是 init + module_name,相当于main函数。它的主要任务是通知Python解释器,我们的Spam中有多少个函数
void initspam(void)
{
    //第一参数 表示module名称
    //第二参数 是一个表格
    Py_InitModule("spam",SpamMethods);
}

/*
怎么样把C代码编译成Python可以使用的模块
一:
    直接和Python的源码一起编译。在unix平台下,只要在Modules/Setup.local中加上一行
    spam  spammodule.o
二:
    把C程序编译成为动态链接库。不同平台下对动态链接库的支出方式是不一样,区别很大。幸好,我们有一个distutils
    的package可以帮助我们做这个事情。编写Setup.py的文件,内容如下:
    from distutils.core import setup, Extension
    module1 = Extension(    'spam', sources = ['demo.c'])
    setup (name = 'spam Name',
           version = '1.0',
           description = 'This is a spam package',
           ext_modules = [module1])
    $python setup.py build    #开始编译


*/

你可能感兴趣的:(怎样编写python脚本的C扩展模块)