Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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 3.x 使用Python 3.8.1 C API中的格式_exc返回非类型_Python 3.x_Exception_Python C Api - Fatal编程技术网

Python 3.x 使用Python 3.8.1 C API中的格式_exc返回非类型

Python 3.x 使用Python 3.8.1 C API中的格式_exc返回非类型,python-3.x,exception,python-c-api,Python 3.x,Exception,Python C Api,我试图在C扩展中检索一个异常+回溯打印输出 我想和你做同样的事 try: print(0/0) # Throw a divide by zero except: traceback_string = traceback.format_exc() 但是在C API中,我可以将结果字符串传递给C端 我的尝试如下: PyObject *result, *output; PyObject *Python3Traceback; char *string; Python3Tracebac

我试图在C扩展中检索一个异常+回溯打印输出

我想和你做同样的事

try:
    print(0/0) # Throw a divide by zero
except:
    traceback_string = traceback.format_exc()
但是在C API中,我可以将结果字符串传递给C端

我的尝试如下:

PyObject *result, *output;
PyObject *Python3Traceback;
char *string;

Python3Traceback = PyImport_ImportModule("traceback");

result = PyRun_String("0/0", Py_eval_input, globals, globals);
if (result == 0) {
    output = PyObject_CallMethod(Python3Traceback, "format_exc", "()");
    string = PyUnicode_AsUTF8AndSize(output, &length);
}
但是字符串总是返回值
NoneType:None
,这与在except子句外调用'traceback.format_exc'相同。如何获取导致结果为0的异常的格式化回溯

我也试过了

PyObject *type, *value, *traceback;
PyErr_Fetch(&type, &value, &traceback);
output = PyObject_ASCII(value);
string = PyUnicode_AsUTF8AndSize(output, &length);

它确实得到了正确的值(值是字符串
除以零),但是我无法计算如何得到完整的回溯打印输出。

我得到了我最终想要的结果,结果如下:

PyErr_Fetch(&type, &value, &traceback);
PyErr_NormalizeException(&type, &value, &traceback);
if (traceback2 != NULL) {
    PyException_SetTraceback(value, traceback);
}
output = PyObject_CallMethod(Python3Traceback, "format_exception", "(OOO)", type, value, traceback);
concat = PyObject_CallMethod(Py_BuildValue("s", ""), "join", "(O)", output);
string = PyUnicode_AsUTF8AndSize(concat, &length);
但是我仍然不知道为什么调用
PyErr\u Fetch
会获取当前的异常信息,而调用
PyObject\u CallMethod(Python3Traceback,“format\u exc”…)
会给出
None