在python中,如果需要实现一些新的函数,类型对象及方法,可以通过C/C++实现新的模块实现。
一个简单的例子
如果要实现一个module叫spam,希望实现一个方法函数system,调用的是C的库函数system()
import spam
status = spam.system("ls -l")
首先创建一个C文件spammodule.c ,该文件包含这个模块的C实现代码,首先第一行:
#include <Python.h>
该头文件包含大部分python run-time的函数,宏定义和变量。该头文件必须第一个包含。
后面需要实现spam.system的具体实现代码
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
sts = system(command);
return PyLong_FromLong(sts);
}
self指向一个当前的对象实体,args是一个python元组的指针。
PyArg_ParseTuple()检查参数类型并将其从python的类型转为C代码的值。
PyLong_FromLong将整数返回为python的整数对象。
在实现该方法的函数后,需要制定这个模块的方法表和初始化函数
static PyMethodDef SpamMethods[] = {
...
{"system", spam_system, METH_VARARGS,
"Execute a shell command."},
...
{NULL, NULL, 0, NULL} /* Sentinel */
};
static struct PyModuleDef spammodule = {
PyModuleDef_HEAD_INIT,
"spam", /* name of module */
spam_doc, /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module,
or -1 if the module keeps state in global variables. */
SpamMethods
};
这个模块必须在初始化函数中进行创建。初始化函数必须以PyInit_name()命名。
PyMODINIT_FUNC
PyInit_spam(void)
{
return PyModule_Create(&spammodule);
}
完成上述步骤后,如果是作为一个永久的模块,只需要将本文件放入到Modules/目录下,在Modules/Setup.local添加下行
spam spammoudle.o