具有动态大小的 Python C 扩展类
Posted
技术标签:
【中文标题】具有动态大小的 Python C 扩展类【英文标题】:Python C-extension class with a dynamic size 【发布时间】:2014-10-14 06:20:53 【问题描述】:我尝试编写包含 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
宏,但没有帮助。
你能给出一个线索或类似的例子吗?
【问题讨论】:
【参考方案1】:也许self->m_cfg
需要先初始化?您正在对其调用 C++ 方法,但没有先调用其构造函数。 struct 是由 C 代码分配的,而不是 C++,所以它不知道需要构造这个字段。
有一些方法可以手动调用构造函数(如果我没记错的话,类似new(&self->m_cfg) XmlConfig()
),但最简单的可能是使用字段XmlConfig *cfg
,并根据需要使用通常的语法分配和释放它C++ 运算符new
和delete
(后者要放在tp_dealloc
中)。
【讨论】:
非常感谢。我选择了new
/delete
最简单的方法。以上是关于具有动态大小的 Python C 扩展类的主要内容,如果未能解决你的问题,请参考以下文章