當前位置:成語大全網 - 新華字典 - python-C相互調用python裏的dict如何作為參數傳入.so中的c語言函數

python-C相互調用python裏的dict如何作為參數傳入.so中的c語言函數

#include?<stdio.h>

#include?<stdlib.h>

#include?<Python.h>

static?PyObject?*

wmf_reverse(PyObject?*self,?PyObject?*args,?PyObject?*kwargs)?{?

static?char*?kwlist[]?=?{"name",?NULL};

char?*name?=?NULL;

PyObject?*retval?=?NULL;?

//?問題1:?只取壹個字符串,format應該是"s"

//?>>>?if(PyArg_ParseTupleAndKeywords(args,keyds,"isi",kwlist,&name))

if?(PyArg_ParseTupleAndKeywords(args,?kwargs,?"s",?kwlist,?&name))?{

retval?=?(PyObject?*)Py_BuildValue("i",1);

printf("%s\n",?name);

//?問題2:不要釋放

//?>>>?free(name);?

}?else?{

retval?=?(PyObject?*)Py_BuildValue("i",0);

}

return?retval;

}?

static?PyMethodDef

wmf_methods[]?=?{

{"reverse",(PyCFunction)wmf_reverse,?METH_VARARGS?|?METH_KEYWORDS,?"reverse"},

//?問題3:方法定義表,應該用壹條空記錄來表示結束。

{NULL,?NULL,?0,?NULL},

};

//?問題4:沒有定義module

static?struct?PyModuleDef

wmf_module?=?{

PyModuleDef_HEAD_INIT,

"wmf",?/*?name?of?module?*/

NULL,/*?module?documentation,?may?be?NULL?*/

-1,?/*?size?of?per-interpreter?state?of?the?module,

or?-1?if?the?module?keeps?state?in?global?variables.?*/

wmf_methods,

};

//?問題5:入口函數要聲明為:PyMODINIT_FUNC

PyMODINIT_FUNC

PyInit_wmf(void)?{

//?問題6:Py_InitModule要初始化的是模塊,不是方法。所以傳方法定義是錯誤的。

//?另外,python2.x是用Py_Init_module,python3.x改用PyModule_Create了。

//?兩者略有差別,自己註意壹下吧。這裏我用的是python3.x。

//Py_InitModule("wmf",ExtestMethods);

PyObject?*m;

m?=?PyModule_Create(&wmf_module);

if?(m?==?NULL)?{

return?NULL;

}

return?m;

}