9

私は 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 側のラッパーが必要です。

これに対処するためのよりクリーンな方法はありますか?

4

3 に答える 3

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;
}
于 2013-07-07T21:34:58.060 に答える