我正在学习如何在Python 3.7中编写本机模块。我正在努力创建和返回新对象。如下所述,似乎使用它会在随机点处生成分段错误。
我看到了很多可以回答这个问题的问题。他们似乎建议使用PyObject_CallObject
与PyObject_New
进行本机对象创建。似乎PyObject_New
并没有初始化新对象中的所有字段成员,但是关于此的详细信息很少。
不幸的是,很多参考文献都是1)10岁或以上或2)模糊且不清楚。
在下面的示例中,当我将类型为PyObject_New
的{{1}}替换为PyObject_CallObject
时,又遇到了另一个分段错误。
test1_obj_type
在2019年初始化Python对象的正确方法是什么?再次有很多关于此主题的问答,但是似乎没有一个提供正确使用 PyObject_CallObject( (PyObject*) &test1_obj_type, NULL);
进行对象创建和初始化的有效示例。
test.c
PyObject_CallObject
python
#include <Python.h>
typedef struct test1_obj
{
PyObject_HEAD
} test1_obj;
static PyObject* create_obj()
{
static PyTypeObject test1_obj_type = {
PyObject_HEAD_INIT(NULL)
.tp_name = "test1_obj",
.tp_doc = "test1_obj",
.tp_basicsize = sizeof(test1_obj),
.tp_itemsize = 0,
.tp_methods = NULL,
.tp_flags = Py_TPFLAGS_DEFAULT,
.tp_new = PyType_GenericNew,
};
return (PyObject*) PyObject_New(test1_obj, &test1_obj_type);
}
PyMODINIT_FUNC PyInit_libmiketest(void)
{
PyObject *module;
static PyMethodDef methods[] = {
{"create_obj", create_obj, METH_NOARGS, "doc"},
{NULL, NULL, 0, ""}
};
static struct PyModuleDef moduledef =
{
PyModuleDef_HEAD_INIT,
"create_obj",
"",
-1,
methods,
NULL,
NULL,
NULL,
NULL
};
module = PyModule_Create(&moduledef);
return module;
}