2013-07-07 5 views
6

Python 2 APIを使用してC++をたくさんラップします(技術的な理由からswigやboost.pythonのようなものは使用できません)。私はC/C++に文字列(通常はパス、常にASCII)に合格しなければならないときに、私はこのようなものを使用します。Python 3 Unicodeをstd :: stringに変換するためのきれいな方法

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

今私はPyString_*の方法が存在しないのPython 3への更新検討しています。

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

しかし、これは(私は最後の行を忘れてしまった場合、それはメモリリークを導入できることを言及していない)を2回行数などで、少し醜いようだ:私はこのような何かをしなければならないと言うone solutionが見つかりました。

他のオプションは、bytesオブジェクトを操作するためのPython関数を再定義すると、これはひどいではありません。この

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

のようにそれらを呼び出すことですが、それは、機能ごとのpython側のラッパーを必要としません。

これに対処するクリーナーの方法はありますか?

+0

'std :: wstring'はなぜですか? –

+0

なぜ、 'std :: wstring'を使うのですか?私はLinuxだけに取り組んでいるので、理解しているので、おそらく何のためにも 'wstring'は必要ありません。 – Shep

+2

'PyObject'を' std :: string'に変換する独自のネイティブ関数でラップしてみませんか? 'std :: string convertPyString(PyObject * pyString);' –

答えて

1

あなたはそれがすべてのASCIIだということ(そしてもちろん、あなたがアサートまたは類似してチェックすることができ)知っている場合は、単にこのようにそれを作成することができます。解決策は、Python 3.3に存在するように

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; 
} 
関連する問題