1. ホーム
  2. python

[解決済み] 3.3でPythonモジュールをロードするとき、PyString_AsStringの代わりに何を使えばいいですか?

2022-02-25 05:26:29

質問

私は、次の関数を使用して、C++プログラムの1つでpythonから関数をロードしようとしています。

char * pyFunction(void)
{
    char *my_result = 0;
    PyObject *module = 0;
    PyObject *result = 0;
    PyObject *module_dict = 0;
    PyObject *func = 0;
    PyObject *pArgs = 0;

    module = PyImport_ImportModule("testPython");
    if (module == 0)
    {
        PyErr_Print();
        printf("Couldn't find python module");
    }
    module_dict = PyModule_GetDict(module); 
    func = PyDict_GetItemString(module_dict, "helloWorld"); 

    result = PyEval_CallObject(func, NULL); 
    //my_result = PyString_AsString(result); 
    my_result = strdup(my_result);
    return my_result;
}

PyString_AsString の代わりに何を使うべきですか?

どのように解決するのですか?

からの戻り値の型に応じて helloWorld() 関数では は異なる可能性があるので、確認したほうがよいでしょう。

返された str (Python 2 unicode ) の場合は をエンコードします。エンコーディングはユースケースによりますが、ここでは はUTF-8を使用します。

if (PyUnicode_Check(result)) {
    PyObject * temp_bytes = PyUnicode_AsEncodedString(result, "UTF-8", "strict"); // Owned reference
    if (temp_bytes != NULL) {
        my_result = PyBytes_AS_STRING(temp_bytes); // Borrowed pointer
        my_result = strdup(my_result);
        Py_DECREF(temp_bytes);
    } else {
        // TODO: Handle encoding error.
    }
}

を処理するために bytes (Python 2 str ) を取得することができます。 の文字列を直接指定することができます。

if (PyBytes_Check(result)) {
    my_result = PyBytes_AS_STRING(result); // Borrowed pointer
    my_result = strdup(my_result);
}

また、文字列でないオブジェクトを受け取った場合、それを変換して を使って PyObject_Repr() , PyObject_ASCII() , PyObject_Str() または PyObject_Bytes() .

というわけで、最終的には、おそらく次のようなものが欲しいのでしょう。

if (PyUnicode_Check(result)) {
    // Convert string to bytes.
    // strdup() bytes into my_result.
} else if (PyBytes_Check(result)) {
    // strdup() bytes into my_result.
} else {
    // Convert into your favorite string representation.
    // Convert string to bytes if it is not already.
    // strdup() bytes into my_result.
}