所以我有一个C程序,它使用嵌入式CPython解释器来执行Python。问题是,如果Python代码有错误,解释器提供的行号信息是无用的,因为每次对PyEval_EvalCodeEx的调用都会从1开始计数行数。所以,每当我执行代码时,我都想给Python解释器一个行号方面的上下文。
有办法这样做吗?看看PyEval_EvalCodeEx的定义,它最终是Python公开的代码执行的最低级别函数,我没有看到任何传递行号信息的机会。
这些文档简单地写着:
PyObject* PyEval_EvalCodeEx(PyObject *co,PyObject *globals,PyObject *locals,PyObject **args,int argcount,PyObject **kws,int kwcount,PyObject **defs,int defcount,PyObject *闭包) 给定用于计算的特定环境,计算预编译代码对象。该环境由全局和局部变量字典、参数数组、关键字和默认值以及单元格的闭包组成。
难道这根本不可能做到吗?
发布于 2014-07-18 16:49:00
如果您查看PyEval_EvalCodeEx()的实现,您可能会看到第一个参数在函数体的开头被传递给PyCodeObject *:
/* File: ceval.c */
PyObject *
PyEval_EvalCodeEx(PyObject *_co, ...)
{
PyCodeObject* co = (PyCodeObject*)_co;
...
}如果您查看PyCodeObject,有一个名为co_firstlineno的成员
/* File: code.h */
typedef struct {
PyObject_HEAD
...
PyObject *co_filename; /* unicode (where it was loaded from) */
PyObject *co_name; /* unicode (name, for reference) */
int co_firstlineno; /* first source line number */
PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See
Objects/lnotab_notes.txt for details. */
...
} PyCodeObject;因此,我想在调用co_firstfileno函数之前修改PyEval_EvalCodeEx()字段就足够了,如下所示:
((PyCodeObject *)co)->co_firstlineno = 42;
PyEval_EvalCodeEx(co, ...);这应该足够了,据我所知,您甚至不需要修改co_lnotab,因为它包含来自co_firstlineno的偏移量,而不是绝对位置。
https://stackoverflow.com/questions/24827224
复制相似问题