Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在打印回溯时引发异常_Python_C++_Python 3.x_Boost_Traceback - Fatal编程技术网

Python在打印回溯时引发异常

Python在打印回溯时引发异常,python,c++,python-3.x,boost,traceback,Python,C++,Python 3.x,Boost,Traceback,环境:Python 3.5和Boost 1.61 我有一个打印python回溯的函数。它依赖于以下机制: traceback.format_异常(exttype,value,traceback); 这就是函数本身: std::string pythonTraceBack() { 使用名称空间boost::python; PyObject*exType; PyObject*值; PyObject*回溯; PyErr_获取(&exType,&value,&traceBack); 对象oExType

环境:Python 3.5和Boost 1.61

我有一个打印python回溯的函数。它依赖于以下机制:

traceback.format_异常(exttype,value,traceback);
这就是函数本身:

std::string pythonTraceBack()
{
使用名称空间boost::python;
PyObject*exType;
PyObject*值;
PyObject*回溯;
PyErr_获取(&exType,&value,&traceBack);
对象oExType(句柄(借用的(extType));
对象oValue(句柄(借来的值));
对象回溯(句柄(借用(回溯));
// 1.
对象行=导入(“回溯”).attr(“格式例外”)(oExType,oValue,oTraceBack);
std::字符串结果;
对于(int i=0;i
  • 这条线似乎是问题的根源。将其替换为
  • objectlines=import(“traceback”).attr(“format_exc”)();
    
    似乎可以解决问题,但输出不是回溯

  • 我试着评论这句话,但没有任何改变
  • 我还尝试用相应的原始对象替换
    oExType、oValue、oTraceBack
    ,但这会在编译过程中导致转换错误

    最小、完整、可验证的示例:

    #include <iostream>
    #include <Python.h>
    #include <boost/python.hpp>
    
    std::string pythonTraceBack() { /* ... */ }
    
    int main()
    {
        using namespace boost::python;
        Py_Initialize();
    
        try
        {
            object main_module = import("__main__");
            object main_namespace = main_module.attr("__dict__");
    
            object ignored = exec("print(1/0)", main_namespace);
        }
        catch (error_already_set const& e)
        {
            std::string error = pythonTraceBack();
            std::cout << "Traceback: " << std::endl << error;
        }
    
        // Py_Finalize();
        return 0;
    }
    
    #包括
    #包括
    #包括
    std::string pythonTraceBack(){/*…*/}
    int main()
    {
    使用名称空间boost::python;
    Py_初始化();
    尝试
    {
    对象主模块=导入(“\uuuu主模块”);
    object main_namespace=main_module.attr(“uu dict_uu”);
    忽略对象=exec(“打印(1/0)”,主名称空间);
    }
    捕获(错误\u已\u设置常量(&e)
    {
    std::string error=pythonTraceBack();
    
    std::我想最好包含一个
    extractedexception()
    给定的异常似乎有效。您的代码缺少对
    PyErr\u NormalizeException
    @J.J.Hakala的调用。谢谢。在
    PyErr\u Fetch
    之后添加了
    PyErr\u NormalizeException
    后,它解决了我的问题。