首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将行号传递给嵌入式Python解释器

将行号传递给嵌入式Python解释器
EN

Stack Overflow用户
提问于 2014-07-18 14:19:11
回答 1查看 346关注 0票数 0

所以我有一个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 *闭包) 给定用于计算的特定环境,计算预编译代码对象。该环境由全局和局部变量字典、参数数组、关键字和默认值以及单元格的闭包组成。

难道这根本不可能做到吗?

EN

Stack Overflow用户

回答已采纳

发布于 2014-07-18 16:49:00

如果您查看PyEval_EvalCodeEx()的实现,您可能会看到第一个参数在函数体的开头被传递给PyCodeObject *

代码语言:javascript
复制
/* File: ceval.c */

PyObject *
PyEval_EvalCodeEx(PyObject *_co, ...)
{
    PyCodeObject* co = (PyCodeObject*)_co;
    ...
}

如果您查看PyCodeObject,有一个名为co_firstlineno的成员

代码语言:javascript
复制
/* 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()字段就足够了,如下所示:

代码语言:javascript
复制
((PyCodeObject *)co)->co_firstlineno = 42;
PyEval_EvalCodeEx(co, ...);

这应该足够了,据我所知,您甚至不需要修改co_lnotab,因为它包含来自co_firstlineno的偏移量,而不是绝对位置。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24827224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档