python给c语言传递参数,【python-C相互调用】python里的dict如何作为参数传入.so中的c语言函数...

用户提问

【python-C相互调用】关于python通过.so调用C函数来读取python里某个key的值并进行处理,一直无法将dict传到C中,求助

1. 首先是C中的包装函数定义

static PyObject *

Extest_reverse(PyObject *self, PyObject *args,PyObject *keyds)

{

//PyObject* keyds = PyDict_Keys(args);

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

char *name; //将dict中的name里的值读到char* name中

PyObject* retval;

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

{

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

printf("%s",name);

free(name);

return retval; //成功读取返回1

}

else

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

return retval; //未读取返回0

}

static PyMethodDef

ExtestMethods[] =

{

{"reverse",(PyCFunction)Extest_reverse,METH_VARARGS | METH_KEYWORDS,"reverse"},

};

void initwmf()

{

Py_InitModule("wmf",ExtestMethods);

}

2.python里的调用 .so已生成,将python 中定义的dict作为参数输入

import wmf

test = {'name':'wmf'}

result = wmf.reverse(test)

print(result)

返回结果一直是0,未读到对应key值的value,进一步查验返现,test这个dict就没有传进去,传入参数是NULL。求助定义的问题,还是调用的问题?如何解决

推荐答案

#include 

#include 

#include 

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值