扩展Python
当Python与您的系统互动时,易于编程的语言变得非常强大,为此,他与这个名叫C的家伙友好了。
Python与C建立了紧密绑定的包装器,以便它可以扩展C API,并与系统接口更紧密地关系。通过在C代码中使用PyObjects来实现Python中的写作包装器,它易于区分python代码,以区分Python代码。 c文件作为大多数Python对象和API以PY或PY开头。
在编写C函数的Python包装器的过程中,以下步骤出现
#myadd.c
- int add(int a, int b)
- {
- return a+b;
- }
这个简单的C函数需要两个参数并重新调整其总和
#包装.C
#包括
第一步是包括一个python标头,其中包括一些必要的命令,例如stdio.h,string.h ...
第二步将是将函数参数从Python转换为C,并以Python友好的形式返回结果。
- PyObject *wrap_add(PyObject *self, PyObject *args) {
- int a,b,result;
- if (!PyArg_ParseTuple(args,"ii",&a,&b))
- return NULL;
- result = add(a,b);
- return Py_BuildValue("i",result);
- }
Python Wrap函数具有两个PyObject参数自我和args。当C实现内置函数并为包含参数的Python元组辩护时,使用了自我
Python和C之间的数据转换是使用两个函数进行的:
int pyarg_parsetuple(pyObject *args,char *格式,...)
pyObject *py_buildvalue(char *格式,...)
pyarg_parsetuple是一个python api,检查了传递的参数类型,如果它们正确,则存储在内存中,并在错误时返回null。py_buildvalue从c函数中以python fromple返回结果。
在我们的情况下,添加了两个参数,这些参数传递给pyarg_parsetuple,然后调用c函数添加,并将值存储在整数结果中,该结果使用py_buildvalue检索
最后一步是让解释器了解我们已经实现了包装器。
- static PyMethodDef exampleMethods[] = {
- { "add", wrap_add, METH_VARARGS,"A simple addition program" },
- { NULL, NULL, 0, NULL }
- };
- void initmyadd() {
- PyObject *m;
- m = Py_InitModule("myadd", exampleMethods);
- }
在pymethoddef中,第一个值是我想在python中给该方法给出的名称(u可以具有不同的名称而不是添加),meth_varargs是一个标志,告诉解释器,要用于C函数的调用惯例第四是DOC字符串。
当MyAdd首次调用InitmyAdd时,它会创建一个模块对象(该模块对象(在键" MyAdd"下插入字典SYS.Modules中),然后将内置函数对象插入基于新创建的模块中表(pymethoddef结构的阵列)作为第二个论点。 py_initmodule()当intialization出错时返回null。