【问题标题】:SWIG, Python and PointersSWIG、Python 和指针
【发布时间】:2012-04-10 13:53:01
【问题描述】:

我正在尝试包装一个源代码不可用的 C API(静态库)。使用 API 的首要任务之一是设置环境结构。

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

有声明

error_code env_setup(env_t ** env);

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

【问题讨论】:

  • 这是一个很好的问题,但是 (a) 请改进格式,并且 (b) 请返回您之前的问题并接受答案,以鼓励人们回答这个问题。跨度>

标签: python swig


【解决方案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

【讨论】:

  • 感谢您的回复,但我能够在 Cython 中用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 2017-05-02
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多