2011-04-14 66 views
4

我想知道什麼是使用SWIG將C中的字符串數組包裝到Python列表的正確方法。SWIG - 將C字符串數組封裝到Python列表

陣列是一個結構內:

typedef struct { 
    char** my_array; 
    char* some_string; 
}Foo; 

SWIG自動換some_string到一個Python字符串。

我應該在SWIG接口文件中放入什麼東西,以便我可以在Python中使用my_array作爲常規Python字符串列表['string1','string2']?

我已經使用類型映射爲sugested:

%typemap(python,out) char** { 
    int len,i; 
    len = 0; 
    while ($1[len]) len++; 
    $result = PyList_New(len); 
    for (i = 0; i < len; i++) { 
    PyList_SetItem($result,i,PyString_FromString($1[i])); 
    } 
} 

但是,這仍然沒有奏效。在Python中,my_array變量顯示爲SwigPyObject:_20afba0100000000_p_p_char。

我不知道是否因爲char **是在一個struct中?也許我需要告訴SWIG?

任何想法?

回答

1

我不認爲有一個選項來自動處理這種轉換SWIG。您需要使用SWIG的Typemap功能並手動編寫類型轉換器。在這裏你可以找到從Python列表到char ** http://www.swig.org/Doc1.3/Python.html#Python_nn59的轉換,所以一半的工作都完成了。你現在需要做的是檢查Typemap的其餘文檔,並將轉換器從char **寫入Python列表。

0

我不是這方面的專家,但我認爲:

%typemap(python,out) char** { 

適用於返回字符的功能**。你的char **是在一個結構裏面..看看swig生成的代碼來確認地圖是否被應用。

您可能需要使用類似:

%typemap(python,out) struct Foo { 

爲了有一個地圖上被返回的結構富工程。

背景:我使用了與您使用的相同的類型映射定義,但是對於char **成功。

相關問題