私は Python 2 API を使用して多くの C++ をラップしています (さまざまな技術的な理由から、swig や boost.python などは使用できません)。文字列 (通常はパス、常に ASCII) を C/C++ に渡す必要がある場合は、次のようなものを使用します。
std::string file_name = PyString_AsString(py_file_name);
if (PyErr_Occurred()) return NULL;
PyString_*
現在、メソッドが存在しないPython 3 への更新を検討しています。次のようなことをする必要があるという1つの解決策を見つけました。
PyObject* bytes = PyUnicode_AsUTF8String(py_file_name);
std::string file_name = PyBytes_AsString(bytes);
if (PyErr_Occurred()) return NULL;
Py_DECREF(bytes);
ただし、これは 2 倍の行数であり、少し醜いように見えます (最後の行を忘れるとメモリ リークが発生する可能性があることは言うまでもありません)。
もう 1 つのオプションは、Python 関数を再定義してbytes
オブジェクトを操作し、次のように呼び出すことです。
def some_function(path_name):
_some_function(path_name.encode('utf8'))
これはひどいことではありませんが、関数ごとに Python 側のラッパーが必要です。
これに対処するためのよりクリーンな方法はありますか?