SWIG、Python和指针

4

我想要包装一个C API(静态库),但源代码没有提供。在使用该API的最初任务之一是设置环境结构。

env_t * my_env = NULL;
result = env_setup(&my_env);

有声明的情况

error_code env_setup(env_t ** env);

在SWIG中,制造这种类型(env_t **)的指针是否可能,考虑到env结构的布局是隐藏的?

1
这是一个不错的问题,但请改善一下格式,同时回到您之前的问题,并接受答案以鼓励更多人回答本问题。 - Chris Eberle
1个回答

1

你可能需要对类型映射进行一些操作。

%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


谢谢回复,但我能够在不到20行的Cython中完成它。如果有人阅读此内容,我建议仅需要Python支持时使用Cython而不是SWIG。 - Vanush Vee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接