SWIG,Python和指针
发布时间:2020-12-20 13:27:32 所属栏目:Python 来源:网络整理
导读:我正在尝试包装一个源API不可用的C API(静态库).使用API??的首要任务之一是设置环境结构. env_t * my_env = NULL;result = env_setup(my_env); 声明 error_code env_setup(env_t ** env); 考虑到env结构的布局是隐藏的,甚至可以在SWIG中制作这种类型的指针(e
我正在尝试包装一个源API不可用的C API(静态库).使用API??的首要任务之一是设置环境结构.
env_t * my_env = NULL; result = env_setup(&my_env); 声明 error_code env_setup(env_t ** env); 考虑到env结构的布局是隐藏的,甚至可以在SWIG中制作这种类型的指针(env_t **)吗? 解决方法
您可能需要对类型图进行一些操作.
%typemap(in) env_t ** (env_t *temp) %{ temp = env_alloc(); PyObject *iter = PyObject_GetIter($input); for (PyObject *item; (item = PyIter_Next(it));) { PyObject *key = PyObject_Str(item); PyObject *val = PyObject_GetItem($input,key); env_set(temp,PyString_AsString(key),PyString_AsString(val),ENV_OVERRIDE); Py_DECREF(val); Py_DECREF(key); Py_DECREF(item); } Py_DECREF(iter); $1 = &temp; %} %typemap(argout) env_t** %{ PyObject *o = PyDict_New(); for (char **val = env_array(*$1); *val; val++) { char *eq = strchr(*val,'='); *eq = ' '; PyMapping_SetItemString(o,*val,eq + 1); } env_free(*$1); $result = SWIG_Python_AppendOutput($result,o); %} 完全未经测试且缺少错误处理,但这里的目的是在从Python调用C时将dict转换为env_t **,并在从C返回到Python时从env_t **转换为dict. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |