python - 了解如何在 3.7 中本地创建 Python 对象
问题描述
我正在学习如何在 Python 3.7 中编写本机模块。我正在为如何创建和返回一个新对象而苦苦挣扎。似乎使用它会在随机点产生分段错误,如下所示。
我见过很多可以回答这个问题的问题。他们似乎建议使用PyObject_CallObject
vsPyObject_New
来创建本机对象。似乎PyObject_New
没有初始化新对象中的所有字段成员,但是这方面的细节很少。
不幸的是,很多参考资料要么是 1) 10 岁以上或以上 2) 含糊不清。
在下面的示例中,当我替换PyObject_New
为PyObject_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
解决方案
推荐阅读
- linux - Linux 唯一值计数
- reactjs - 等待生成器在 redux-saga 中完成
- java - 关联一个且仅一个对象
- python - GUI 应用程序中的 sqlalchemy 会话处理
- mongodb - 如何正确查询以获取当前数据格式所需的统计数据?(mongoDB/NoSQL)
- python - 使用opencv计算二进制掩码中的分离形状区域
- javascript - 检测 iPhone 上的抖动事件
- javascript - 如何从 Lightning 组件中的非默认导出类中读取属性
- testing - 无法从“saveScreenshot”webdriverio 中捕获错误
- java - AfterThrowing建议,委托服务