【发布时间】:2020-05-22 16:32:09
【问题描述】:
我一直在尝试从 C++ 代码调用 Python 脚本。一般情况下一切正常,但是当脚本中发生错误并且我捕获异常(error_already_set)时,我想获得 C++ 端的详细信息,例如脚本中发生错误的行号。要获取此信息,我调用 PyErr_Fetch(&type, &value, &traceback) 并且始终无法获取非 NULL 回溯然后提取详细信息。一个非常奇怪的事情是,对 PyErr_Print() 的后续调用一直成功,我在屏幕上观察到详细的错误信息。问题是我需要这个信息在我的 C++ 代码中的字符串中,而不仅仅是在屏幕上。 如果您有任何想法要走哪条路以及要尝试什么,我将不胜感激。提前谢谢你。
这是成员函数,其中 Python 脚本由索引调用:
void ScriptManager::ExecPythonScript(unsigned Index)
{
GILManager lock;
try {
object result = exec(mScripts[Index].c_str(), mMain);
mRetValues[Index] = extract<std::string>(mMain["retVal"]);
}
catch (const error_already_set&) {
PyObject* ptype;
PyObject* pvalue;
PyObject* ptraceback;
PyErr_Fetch(&ptype, &pvalue, &ptraceback); // ptraceback is always NULL
// PyErr_Print(); // works fine
}
}
【问题讨论】:
-
你能分享行为不端的代码吗?最好以其他人可以编译和测试的方式。并删除了不相关的部分。我们不知道你如何初始化python解析器,你如何调用它,从python脚本中逃出什么样的异常,如果你对从PyErr_fetch收到的异常进行规范化,等等......