【问题标题】:How to extract a string from a Python 3 exception via the C API如何通过 C API 从 Python 3 异常中提取字符串
【发布时间】:2018-03-23 14:21:47
【问题描述】:

我有一些使用 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) {
        // ???
    }
}

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

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

【问题讨论】:

    标签: string python-3.x c-api


    【解决方案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 也知之甚少。

    【讨论】:

    • PyObject_Str() 创建一个新的引用。我正在尝试做同样的事情,但使用 PyBytes_AsString()
    猜你喜欢
    • 2010-11-03
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多