加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读