引用 http://blog.youkuaiyun.com/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 #开始编译
*/