2012-04-10 57 views
4

我想包裝一個來源不可用的C API(靜態庫)。使用API​​的首要任務之一是建立環境結構。SWIG,Python和指針

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

與申報

error_code env_setup(env_t ** env); 

它甚至有可能製造這種類型(env_t **)在痛飲的指針,考慮到ENV結構的佈局被隱藏?

+1

這是一個很好的問題,但是(a)請改進格式,(b)請回到以前的問題並接受答案,以鼓勵人們回答這個問題。 – 2012-04-10 04:00:51

+0

我已經這麼做了。 ' – 2012-04-10 04:05:28

回答

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時,從env_t **dict由C返回到Python時將dict轉變爲一個env_t **

+0

感謝您的回覆,但我能夠在<20行的Cython中執行此操作。如果有人讀到這個,如果你只需要Python支持,我建議使用Cython而不是SWIG。 – 2012-04-10 06:00:36