【发布时间】:2017-10-19 08:28:50
【问题描述】:
我正在使用用于 C/C++ 的 python API,我想检索 发生 NameError 时的行号。
我按照以下问题中的说明进行操作:
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(例如,对于像“A =”这样的简单 python 代码), 但在出现 NameError 的情况下,行号未正确设置为 pvalue 对象(例如,对于 python 代码:“A=undefined_var”)。
有什么办法可以解决这个问题吗?
【问题讨论】:
-
你不能为此使用 boost 库吗?然后你可以查看这个 stackoverflow 链接:How to get Python exception text
-
很遗憾,我无法使用 boost 库。感谢您的回答!
-
请注意,您绝对必须检查每个
Py_*函数的返回值,分别并采取相应措施。跨度> -
您会注意到
NameError甚至没有lineno属性。 -
如果你做对了,你会知道
NameError没有属性lineno而那 就是原因它不起作用。您需要访问traceback