SWIG、Python和指针

SWIG、Python和指针,python,swig,Python,Swig,我试图包装一个源代码不可用的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) %{ t

我试图包装一个源代码不可用的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 = '\0';
        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

这是一个好问题,但是(a)请改进格式,以及(b)请回到您之前的问题并接受答案,以鼓励人们回答这一问题。谢谢您的回答,但我能用Cython在<20行中回答。如果有人读到这篇文章,我建议如果您只需要Python支持,就使用Cython而不是SWIG。