扩展Python

当Python与您的系统互动时,易于编程的语言变得非常强大,为此,他与这个名叫C的家伙友好了。
Python与C建立了紧密绑定的包装器,以便它可以扩展C API,并与系统接口更紧密地关系。通过在C代码中使用PyObjects来实现Python中的写作包装器,它易于区分python代码,以区分Python代码。 c文件作为大多数Python对象和API以PY或PY开头。
在编写C函数的Python包装器的过程中,以下步骤出现
#myadd.c

选择 | 换行 | 行号
  1. int add(int a, int b)
  2. {
  3.   return a+b;
  4. }
  5.  

这个简单的C函数需要两个参数并重新调整其总和
#包装.C
#包括
第一步是包括一个python标头,其中包括一些必要的命令,例如stdio.h,string.h ...
第二步将是将函数参数从Python转换为C,并以Python友好的形式返回结果。

选择 | 换行 | 行号
  1. PyObject *wrap_add(PyObject *self, PyObject *args) {
  2.      int a,b,result;
  3.      if (!PyArg_ParseTuple(args,"ii",&a,&b))
  4.           return NULL;
  5.      result = add(a,b);
  6.      return Py_BuildValue("i",result);
  7. }

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检索
最后一步是让解释器了解我们已经实现了包装器。

选择 | 换行 | 行号
  1. static PyMethodDef exampleMethods[] = {
  2.          { "add", wrap_add, METH_VARARGS,"A simple addition program" },
  3.          { NULL, NULL, 0, NULL }
  4. };
  5. void initmyadd() {
  6.          PyObject *m;
  7.          m = Py_InitModule("myadd", exampleMethods);
  8. }

在pymethoddef中,第一个值是我想在python中给该方法给出的名称(u可以具有不同的名称而不是添加),meth_varargs是一个标志,告诉解释器,要用于C函数的调用惯例第四是DOC字符串。
当MyAdd首次调用InitmyAdd时,它会创建一个模块对象(该模块对象(在键" MyAdd"下插入字典SYS.Modules中),然后将内置函数对象插入基于新创建的模块中表(pymethoddef结构的阵列)作为第二个论点。 py_initmodule()当intialization出错时返回null。

标签: python

添加新评论