Python 3:Python/C API字符串问题

Python 3: Python/C API String Problems

本文关键字:Python 字符串 问题 API      更新时间:2023-10-16

我正在尝试使用Python/C API来运行返回字符串的Python函数。我想将返回的字符串存储到C++变量中,但我无法使其工作。我使用的是Python3,PyString_FromString()方法似乎已经不起作用了。这是我的代码:

int main(int argc, char *argv[])
{
    PyObject *pName, *pModule, *pDict, *pFunc, *pValue;
    Py_Initialize();
    pName = PyUnicode_FromString("ocr");
    pModule = PyImport_Import(pName);
    pDict = PyModule_GetDict(pModule);
    pFunc = PyDict_GetItemString(pDict, "get_text");
    pValue = PyUnicode_FromString("ocr_noise.png");
    pValue = PyObject_CallObject(pFunc, pValue);
    std::string result = PyUnicode_FromObject(pValue);
    Py_DECREF(pModule);
    Py_DECREF(pName);
    Py_DECREF(pValue);
    Py_Finalize();
    return 0;
}

python文件名为ocr.py,我尝试调用的函数名为get_text(value)。我正试图把"ocr_noise.png"作为一个论据。有什么想法吗?

编辑2:我不需要像在代码中那样使用std::string。我还能用什么来存储函数返回的字符串?

检查所有Python函数的返回值非常重要。如果出现错误,Python将返回一个nullptr。因此PyUnicode_FromString()在您的代码中运行良好。它只是分段故障,因为pValue是从PyObject_CallObject()得到的nullptr。将PyErr_Print()放在此调用之后打印:

TypeError: argument list must be a tuple

您需要传递一个对象元组作为参数,而不是单个str。相反,您可能希望使用PyObject_CallFunction(pFunc, "O", pValue)PyObject_CallFunction(pFunc, "s", "ocr_noise.png")

此外,请查看PyImport_ImportModule()。此外

std::string result = PyUnicode_FromObject(pValue);

甚至不应该编译,因为它返回的是CCD_ 15而不是CCD_。