Python 3.x 使用Python 3.8.1 C API中的格式_exc返回非类型
我试图在C扩展中检索一个异常+回溯打印输出 我想和你做同样的事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
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