2013-07-07 73 views
6

我使用Python 2 API封裝了很多C++(由於各種技術原因,我不能使用像swig或boost.python之類的東西)。當我要傳遞一個字符串(通常是一個路徑,總是ASCII)轉換爲C/C++,我用的是這樣的:乾淨的方法來轉換Python 3 Unicode到std ::字符串

std::string file_name = PyString_AsString(py_file_name); 
if (PyErr_Occurred()) return NULL; 

現在我正在考慮更新到Python 3,其中PyString_*方法不存在。我發現one solution,說我應該做這樣的事情:

PyObject* bytes = PyUnicode_AsUTF8String(py_file_name); 
std::string file_name = PyBytes_AsString(bytes); 
if (PyErr_Occurred()) return NULL; 
Py_DECREF(bytes); 

然而,這是兩倍多的線,似乎有點難看(更不用提,它可能會引入內存泄漏,如果我忘記了最後一行)。

另一種選擇是重新定義Python函數對bytes對象進行操作,並呼籲他們這樣

def some_function(path_name): 
    _some_function(path_name.encode('utf8')) 

這並不可怕,但它確實需要對每個功能的蟒蛇端包裝。

是否有一些更清潔的方式來處理這個問題?

+0

爲什麼不'std :: wstring'? –

+0

嗯,爲什麼我會使用'std :: wstring'?我只使用Linux,所以據我的理解,我可能不需要任何東西的'wstring'。 – Shep

+2

爲什麼不把它包裝在自己的本地函數中,將'PyObject'轉換爲'std :: string'? 'std :: string convertPyString(PyObject * pyString);' –

回答

1

如果你知道它的所有ASCII(當然,你可以用一個斷言或類似的檢查),那麼你可以簡單地這樣創造的:

std::string py_string_to_std_string(PyUnicode_string py_file_name) 
{ 
    len = length of py_file_name;  // Not sure how you write that in python. 
    std::string str(len); 
    for(int i = 0; i < len; i++) 
     str += py_file_name[i]; 
    return str; 
} 
相關問題