Python APIをC/C++に使用していて、NameErrorの場合には 行番号を取得したいと考えています。Python C++ API:NameErrorのlineno属性を取得する方法
Iが蛇腹質問内に見出される命令に続く:
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")。
どのようにすればこの問題を解決できますか?
は、あなたがこのためだけにブーストライブラリを使用することができませんか? 次に、このスタックオーバーフローリンクをチェックアウトすることができます: [Python例外テキストの入手方法](https://stackoverflow.com/questions/1418015/how-to-get-python-exception-text/37780954) – Spezi94
残念ながら、私はブーストライブラリを使用することはできません。答えをありがとう! – tsahmatsis
**それぞれのPy_ *関数**の戻り値**を個別にチェックして、それに応じて**絶対にチェックしなければならないことに注意してください。 –