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側のラッパーを必要としません。
これに対処するクリーナーの方法はありますか?
'std :: wstring'はなぜですか? –
なぜ、 'std :: wstring'を使うのですか?私はLinuxだけに取り組んでいるので、理解しているので、おそらく何のためにも 'wstring'は必要ありません。 – Shep
'PyObject'を' std :: string'に変換する独自のネイティブ関数でラップしてみませんか? 'std :: string convertPyString(PyObject * pyString);' –