具有动态大小的Python C扩展类

Python C-extension class with a dynamic size

本文关键字:Python 扩展 动态      更新时间:2023-10-16

我尝试编写包含python类的C扩展。

此类将文件名作为构造函数的参数fname,然后将该文件加载到内存并作为配置存储。

下面我有:

typedef struct {
    PyObject_HEAD
    XmlConfig m_cfg;
} PyAgent;
static int PyAgent_init(PyAgent *self, PyObject *args) {
    const char *fname;
    if (!PyArg_ParseTuple(args, "s", &fname)) {
    return NULL;
    }
    self->m_cfg.Load(fname);
    return 0;
}
static PyTypeObject PyAgentType = {
   PyObject_HEAD_INIT(NULL)
   0,                                            /* ob_size */
   "classify.Agent",                             /* tp_name */
   ...
}
...

当我尝试加载文件时,出现分段错误。据我所知,之所以会发生这种情况,是因为PyAgent struct的对象大小由于文件的内存分配而增加。

我尝试过使用PyObject_VAR_HEAD宏,但没有帮助。

你能给出一个线索或类似的例子吗?

也许self->m_cfg需要先初始化?您正在对其调用C++方法,但没有首先调用其构造函数。结构是由C代码分配的,而不是C++,所以它不知道需要构造这个字段。

有一些方法可以手动调用构造函数(如果我没记错的话,类似于new(&self->m_cfg) XmlConfig()),但最简单的方法可能是使用字段XmlConfig *cfg,并根据需要使用C++运算符newdelete(后者将放在tp_dealloc中)的常用语法来分配和释放它。