如何通过 C API 从 Python 3 异常中提取字符串

How to extract a string from a Python 3 exception via the C API

提问人:sbi 提问时间:3/23/2018 最后编辑:sbi 更新时间:3/26/2018 访问量:1108

问:

我有一些使用 Boost.Python 运行 Python 3 代码的 C++ 代码。如果 Python 中发生任何异常,则会捕获该异常并引发 C++ 异常。我想将一些最小的错误信息传递给 C++ 异常。

我目前拥有的是:

try {
    // execute python code via Boost.Python
} catch(boost::python::error_already_set&) {
    PyObject *ptype, *pvalue, *ptraceback;
    PyErr_Fetch(&ptype, &pvalue, &ptraceback);
    if(pvalue) {
        // ???
    }
}

SO 有很多有用的答案,但它们似乎都适用于 Python 2,它们的解决方案不再有效。我尝试过一些类似 , , 但我得到的只是空指针。PyBytes_AsStringPyUnicode_AsUTF8

我该如何从中提取有意义的东西?对于初学者来说,引发的异常的类型名称已经很有帮助了。如果有一个字符串传递给异常,获取它将是最有帮助的。pvalue

字符串 python-3.x c-api

评论


答:

4赞 sbi 3/23/2018 #1

当然,在我制定并发布这个问题后,我自己立即找到了解决方案。

这段代码终于奏效了,并提供了很好的信息:

try {
    // execute python code via Boost.Python
} catch(boost::python::error_already_set&) {
    PyObject *ptype, *pvalue, *ptraceback;
    PyErr_Fetch(&ptype, &pvalue, &ptraceback);
    if(pvalue) {
        PyObject *pstr = PyObject_Str(pvalue);
        if(pstr) {
            const char* err_msg = PyUnicode_AsUTF8(pstr);
            if(pstr)
                // use err_msg
        }
        PyErr_Restore(ptype, pvalue, ptraceback);
    }
}

不过,我很高兴有任何反馈。我对 Python 知之甚少,对它的 C API 也知之甚少。

评论

0赞 Jiminion 1/25/2019
PyObject_Str() 创建一个新引用。我正在尝试做同样的事情,但使用 PyBytes_AsString()