gpt4 book ai didi

python - 如何检索 SyntaxError 的文件名和 lineno 属性

转载 作者:太空狗 更新时间:2023-10-29 21:07:30 27 4
gpt4 key购买 nike

我在我的应用程序中嵌入了 python 解释器。我使用它通过 PyRun_String() API 运行 python 脚本。如果遇到错误/异常,我可以使用 PyErr_Fetch() 获取错误信息。这给了我异常类型、异常值和异常回溯。然后我从回溯中找到起源错误的行号。但是,如果出现语法错误,我不会得到任何类型的回溯。有谁知道如何在没有回溯的情况下检索行号..?有什么方法可以使用异常类型或异常值来检索它..?

Python 文档指出:

Instances of this class have attributes filename, lineno, offset and text for easier access to the details. str() of the exception instance returns only the message.

如何在嵌入式 python 中检索 SyntaxError 的文件名和 lineno 属性?

任何帮助将不胜感激。提前致谢。


感谢布雷特的建议。但我已经使用 PyObject_GetAttr() 尝试过了。

请参阅下面我用于测试目的的示例代码。

int main(int argc, char** argv)
{
Py_Initialize();

// Get a reference to the main module.
PyObject* main_module =
PyImport_AddModule("__main__");

// Get the main module's dictionary
// and make a copy of it.
PyObject* main_dict =
PyModule_GetDict(main_module);

const char *script_source = "def main():\n\tprint('Hello'\n\nmain()";

PyObject *res = PyRun_String(script_source,Py_file_input,main_dict,main_dict);
if(res == NULL)
{
PyObject *ptype = NULL, *pvalue = NULL, *ptraceback = NULL;
PyErr_Fetch(&ptype,&pvalue,&ptraceback);

PyObject* py_filename = PyUnicode_FromString("filename");
PyObject* file_name = PyObject_GetAttr(ptype,py_filename);

PyObject* py_lineno = PyUnicode_FromString("lineno");
PyObject* line_no = PyObject_GetAttr(ptype,py_lineno);
}
}

我故意在 script_source 中插入了语法错误。

我无法从 file_name 和 line_no 对象中检索实际文件名和行号。

我尝试调试 file_name 和 line_no 对象,内容如下所示。“语法错误对象的成员文件名”和“语法错误对象的成员行号”

这些对象不可调用,所以我不能对这些对象使用 PyObject_Call() 变体。

有什么方法可以让我从这些对象的...中获取实际的文件名和行号?

此文件名将与我使用的 PyRun_String() 相同。

最佳答案

我通过以下方式解决了它。我在 PyErr_Fetch() 之后使用了 PyErr_NormalizeException(),代码现在工作正常。

int main(int argc, char** argv)
{
Py_Initialize();

// Get a reference to the main module.
PyObject* main_module =
PyImport_AddModule("__main__");

// Get the main module's dictionary
// and make a copy of it.
PyObject* main_dict =
PyModule_GetDict(main_module);

const char *script_source = "def main():\n\tprint('Hello'\n\nmain()";

PyObject *res = PyRun_String(script_source,Py_file_input,main_dict,main_dict);
if(res == NULL)
{
PyObject *ptype = NULL, *pvalue = NULL, *ptraceback = NULL;
PyErr_Fetch(&ptype,&pvalue,&ptraceback);
PyErr_NormalizeException(&ptype,&pvalue,&ptraceback);

char *msg;
char *file;
int line;
int offset;
char *text;

int res = PyArg_ParseTuple(pvalue,"s(siis)",&msg,&file,&line,&offset,&text);

PyObject* file_name = PyObject_GetAttrString(pvalue,"filename");
PyObject* file_name_str = PyObject_Str(file_name);
PyObject* file_name_unicode = PyUnicode_AsEncodedString(file_name_str,"utf-8", "Error");
char *actual_file_name = PyBytes_AsString(file_name_unicode);

PyObject* line_no = PyObject_GetAttrString(pvalue,"lineno");
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);

printf("done");
}
}

关于python - 如何检索 SyntaxError 的文件名和 lineno 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16733425/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com