我使用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'))
這並不可怕,但它確實需要對每個功能的蟒蛇端包裝。
是否有一些更清潔的方式來處理這個問題?
爲什麼不'std :: wstring'? –
嗯,爲什麼我會使用'std :: wstring'?我只使用Linux,所以據我的理解,我可能不需要任何東西的'wstring'。 – Shep
爲什麼不把它包裝在自己的本地函數中,將'PyObject'轉換爲'std :: string'? 'std :: string convertPyString(PyObject * pyString);' –