2014-07-02 84 views
1

我用swig包裝了一些C++的api函數。 有一個函數,接口是f(char * [] strs)。我怎麼能從python得到char * []

如何將有效參數傳遞給此函數。 這就是我所做的。

str = ["str","str2"] 
f(str) 

它會拋出錯誤

TypeError: in method 'f', argument 1 of type 'char *[] 
+1

檢查'˚Ffunction',它採用'的char []'列表你給了'string of list'。所以用'char list'調用''f函數'.' –

+0

@Odedra char *是一個C中的字符串,你可以像這樣初始化一個char * []。 char * list [] = {「str」,「str1」} – Crazymooner

回答

1

痛飲不轉換陣列到Python會自動列出。由於您使用的是C++,因此您的f使用std :: string和std :: vector,那麼SWIG將自動進行所有必要的轉換(不要忘記包含「std_vector.i」等,請參閱SWIG文檔):

void f(std::vector<std::string> > strs) 

如果不能修改的f的聲明,你可以在。我創建%inline包裝:

%inline { 
    void f(const std::vector<std::string> >& strs) 
    { 
     // create tmpCharArray of type char*[] from strs 
     const char* tmpCharArray[] = new const char* [strs.size()]; 
     for (i=0; i<strs.size(); i++) 
       tmpCharArray[i] = strs[i].c_str(); 
     f(tmpCharArray); 
     delete[] tmpCharArray; 
    } 
} 
+0

謝謝!這是我需要的答案。 – Crazymooner

+0

很酷。讓我知道是否有任何需要改進的地方,歡迎來到SO! – Schollii

+1

這是一個足夠好的答案。我發現[東西](http://www.swig.org/Doc1.3/Python.html#Python_nn59)更酷。這樣,我甚至不必編寫一個包裝器,char **可以用於所有需要的功能。 – Crazymooner