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 如何拥有 C++ 类?

根据 boost python 的分步指导引发的 boost python 错误

Boost Python,Visual Studio链接到错误的boost dll

Boost.Python不是.lib

Boost.Python 对象的 id