boost::python: PyErr_Fetch 总是返回 NULL 回溯
Posted
技术标签:
【中文标题】boost::python: PyErr_Fetch 总是返回 NULL 回溯【英文标题】:boost::python: PyErr_Fetch always returns NULL traceback 【发布时间】: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收到的异常进行规范化,等等...... 【参考方案1】:最后,我发现对于某些类型的脚本错误(例如语法错误),traceback 为 NULL,并且所有相关信息都在第二个参数(值)中返回。
【讨论】:
以上是关于boost::python: PyErr_Fetch 总是返回 NULL 回溯的主要内容,如果未能解决你的问题,请参考以下文章
Boost.Python 创建的 dll 无法导入(遵循 Boost Python 的 QuickStart)
根据 boost python 的分步指导引发的 boost python 错误