2012-03-14 137 views
4

我正在使用C++作爲後端的ctypes。現在有在C++這樣的功能:ctypes python std :: string

void HandleString(std::string something){ 

    ... 
} 

我想知道如何調用從蟒蛇這個功能 - 沒有CTYPE(c_char_p不會明顯工作)將字符串參數發送到這個功能...

我怎樣才能解決這個問題,並從Python中傳遞一個字符串到C++(和改變參數爲char *的東西是不是和選項)

PS我能創造這樣的解決方法嗎?

  1. 發送蟒字符串作爲c_char_p到C++函數,其將字符*到std :: string的
  2. 返回字符串或它的指針不知何故??? !! (如何?)到Python
  3. 從蟒蛇發送到HandleString功能(但我又覺得我將不得不將參數更改爲字符串*這裏)
+1

如果你要解決這個問題,把你的c_char_p發送到一個C++函數將其轉換爲'std :: string',然後立即調用'HandleString'是否更有意義?實際上,有一個從const char *到'std :: string'的隱式轉換,所以你的解決方法就可以使用指針作爲'HandleString'的參數表達式。不要試圖將'std :: string'傳遞迴Python。 – 2012-03-14 13:45:38

回答

3

聽起來像最簡單的方法是寫一個薄C++封裝庫的唯一目的是將參數從python重新協商到更復雜的C++類中。

這樣的方法也可以幫助解決將來的同類問題,而不會爲python代碼或C++代碼增加任何實際的複雜性。

3

Python的C API的Python str對象轉換成char*,並且有 在C++中從char*(實際上char const*) 到std::string的隱式轉換。

如果Python字符串可以包含空字符,你將不得不使用 PyString_AsStringAndSize進行轉換,並通過圍繞兩個值 (在char*Py_ssize_t);還有一個明確的 轉換爲std::stringstd::string(pointer, length)