首页 > 解决方案 > 了解如何在 3.7 中本地创建 Python 对象

问题描述

我正在学习如何在 Python 3.7 中编写本机模块。我正在为如何创建和返回一个新对象而苦苦挣扎。似乎使用它会在随机点产生分段错误,如下所示。

我见过很多可以回答这个问题的问题。他们似乎建议使用PyObject_CallObjectvsPyObject_New来创建本机对象。似乎PyObject_New没有初始化新对象中的所有字段成员,但是这方面的细节很少。

不幸的是,很多参考资料要么是 1) 10 岁以上或以上 2) 含糊不清。

在下面的示例中,当我替换PyObject_NewPyObject_CallObject类型时,test1_obj_type我得到另一个分段错误。

 PyObject_CallObject( (PyObject*) &test1_obj_type, NULL);

2019年初始化Python对象的正确方法是什么?同样有很多关于这个主题的问答问题,但是似乎没有一个提供正确使用PyObject_CallObject对象创建和初始化的有效示例。

测试.c

#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;
}

Python

>>> import libmiketest
>>> a = libmiketest.create_obj()
>>> help(a)
Segmentation fault: 11

标签: pythonc

解决方案


推荐阅读