我正在使用Python API for C/C++,并且我想在NameError的情况下检索 行号。Python C++ API:如何检索NameError的lineno属性
我跟着波纹管的问题中发现的说明:
How to retrieve filename and lineno attribute of SyntaxError
,我写了下面的代码:
PyObject *ptype = NULL, *pvalue = NULL, *ptraceback = NULL;
PyObject *comp = NULL, *eval = NULL;
char code[] = {"A=undef_var"};
comp = Py_CompileString(code, "", Py_file_input);
if (comp) {
eval = PyEval_EvalCode(comp, PyEval_GetBuiltins(), NULL);
}
if (!comp || !eval) {
PyErr_PrintEx(1); // inside this function the PyErr_Fetch(ptype, pvalue, ptraceback) is called
// retrieve the information gained from PyErr_Fetch() called inside PyErr_PrintEx(1)
pvalue = PySys_GetObject("last_value");
ptype = PySys_GetObject("last_type");
ptraceback = PySys_GetObject("last_traceback");
PyErr_NormalizeException(ptype, pvalue, ptraceback);
PyObject* line_no = PyObject_GetAttrString(pvalue,"lineno");
if (line_no) {
PyObject* line_no_str = PyObject_Str(line_no);
PyObject* line_no_unicode = PyUnicode_AsEncodedString(line_no_str,"utf-8", "Error");
char *actual_line_no = PyBytes_AsString(line_no_unicode);
}
}
上面的代码返回正确的行号,以防python代码 包含一个SyntaxError(例如对于一个简单的Python代码,如“A =”), 但在NameError的情况下,行号未设置为相关适用于pvalue对象(例如对于Python代码:“A = undefined_var”)。
任何想法如何解决这个问题?
你就不能使用boost库呢? 然后你可以看看这个stackoverflow链接: [如何获得Python异常文本](https://stackoverflow.com/questions/1418015/how-to-get-python-exception-text/37780954) – Spezi94
不幸的是,我不能使用boost库。感谢你的回答! – tsahmatsis
请注意,您必须单独检查**每个“Py_ *”函数**的**返回值,并相应地执行。 –