在3.3中加载python模块时,我使用什么代替PyString_AsString ?

What do I use instead of PyString_AsString when loading a python module in 3.3

本文关键字:什么 PyString AsString python 加载 模块      更新时间:2023-10-16

我试图在我的一个c++程序中使用这个函数从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.
}

如果您使用PyString_AsString来获得您所知道的str对象的c兼容const char*表示,那么在Py3中您可以简单地使用PyUnicode_AsUTF8:

    func = PyDict_GetItemString(module_dict, "helloWorld"); 
    result = PyEval_CallObject(func, NULL); 
    const char* my_result = PyUnicode_AsUTF8(result);