【问题标题】:boost::python: PyErr_Fetch always returns NULL tracebackboost::python: PyErr_Fetch 总是返回 NULL 回溯
【发布时间】: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收到的异常进行规范化,等等......

标签: python c++ boost


【解决方案1】:

最后,我发现对于某些类型的脚本错误(例如语法错误),traceback 为 NULL,并且所有相关信息都在第二个参数(值)中返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2016-11-02
    • 2014-05-06
    • 2012-06-05
    • 2014-05-30
    • 2014-02-23
    • 2017-10-12
    相关资源
    最近更新 更多