C++调用Python函数异常信息的输出,使用 PyErr_Print()无法打印时
**注意:**首先要确定环境都正确
PyRun_SimpleString("python使用的库");
// 加载Python模块
PySys_SetPath(L"项目地址");
PyObject* pModule = PyImport_ImportModule(".py文件名称");
if (!pModule) {
qDebug() << "Failed to load Python module." ;
}
// 获取Python模块中的函数
PyObject* pFunc = PyObject_GetAttrString(pModule, "函数名称(不加括号)");
if (!pFunc) {
qDebug() << "Failed to get function." ;
}
// 构造函数参数
PyObject* pArgs = PyTuple_New(参数个数);
/*
//如果有参数可按照这种方式将参数传递,没有参数则加上没有参数的代码,这里没有给出没有参数的示例
PyObject* num_python = PyLong_FromLong(num);
PyObject* path_data_python = PyUnicode_FromString(datapath.c_str());
PyObject* path_label_python = PyUnicode_FromString(labelpath.c_str());
PyTuple_SetItem(pArgs, 0, num_python);
PyTuple_SetItem(pArgs, 1, path_data_python);
PyTuple_SetItem(pArgs, 2, path_label_python);
*/
// 调用 Python 函数
PyObject* pResult = PyObject_CallObject(pFunc, pArgs);
if (!pResult) {
qDebug()<< "Failed to call function." ;
// 获取异常信息
PyObject *ptype, *pvalue, *ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback);
PyErr_NormalizeException(&ptype, &pvalue, &ptraceback);
// 打印异常信息
if (pvalue) {
PyObject* pStr = PyObject_Str(pvalue);
const char* pErrorMsg = PyUnicode_AsUTF8(pStr);
if (pErrorMsg) {
qDebug() << "Error message: " << pErrorMsg;
}
Py_XDECREF(pStr);
}
}
之后运行就会打印出异常出现的问题