PyModule_AddObject Crashing

Я столкнулся с проблемой, которую просто пытался выяснить. В event_initЯ нашел это призвание PyModule_AddObject не сработает, что бы я ни делал с типами и созданием модулей. Пытаясь еще больше изолировать проблему, я выяснил, что добавляются только мои собственные типы, что приводит к сбою (добавление Py_True работает нормально), и именно манипулирование словарем модуля фактически приводит к его падению (внутренний вызов PyDict_SetItem)

#include <Python.h>
#include <structmember.h>

struct pyEventProxy{
PyObject_HEAD
};

static PyObject* pyKey_on(PyObject*,PyObject* args,PyObject* kwargs){
/* ... */
}

static PyMethodDef pyKey_Methods[]={
{"on",(PyCFunction)pyKey_on,METH_STATIC,"Bind a keyboard event handler for one or more events."},
{NULL}
};

static PyTypeObject pyKey_Type={
PyVarObject_HEAD_INIT(NULL,0)
"key",
sizeof(pyEventProxy),
0,
0,
0,                         /* tp_print */
0,                         /* tp_getattr */
0,                         /* tp_setattr */
0,                         /* tp_reserved */
0,                         /* tp_repr */
0,                         /* tp_as_number */
0,                         /* tp_as_sequence */
0,                         /* tp_as_mapping */
0,                         /* tp_hash  */
0,                         /* tp_call */
0,                         /* tp_str */
0,                         /* tp_getattro */
0,                         /* tp_setattro */
0,                         /* tp_as_buffer */
Py_TPFLAGS_DEFAULT,
"Proxy object to access specific event functions.",
0,                          /* tp_traverse */
0,                          /* tp_clear */
0,                         /* tp_richcompare */
0,                         /* tp_weaklistoffset */
0,                         /* tp_iter */
0,                         /* tp_iternext */
pyKey_Methods,             /* tp_methods */
};

static PyModuleDef pyEvent_Module={
PyModuleDef_HEAD_INIT,
"event",
"Interact with Sandblox's event handling.",
-1,
0,
0,
0,
0,
0
};

//Function called in another file to initialize the module
void event_init(){
printf("Initializing key proxy type\n");
if(PyType_Ready(&pyKey_Type)<0){
printf("Key preparation failed\n");
return;
}

printf("Creating module\n");
PyObject* module=PyModule_Create(&pyEvent_Module);
if(!module){
return;
}

printf("Adding key proxy\n");
Py_INCREF(&pyKey_Type);
//This crashes
PyModule_AddObject(module,"key",(PyObject*)&pyKey_Type);
}

Я работаю над тем, чтобы выяснить это в течение нескольких недель, но это все еще вне меня, что даже не так. Другое дело, что простой пример из учебника по расширению Python падает так же, как мой, но не для последующих примеров. Что я здесь не так делаю?

(в случае, если это кажется знакомым, я задал этот вопрос неделю назад и получил значок «перекати-поле». Итак …)

1

Решение

В Python 3.x функция инициализации модуля должен вернуть объект модуля. Ваш код не будет работать таким образом. Правильная функция init для вашего модуля выглядит следующим образом:

PyMODINIT_FUNC
PyInit_event(void) {
PyObject *module;
module = PyModule_Create(&pyEvent_Module);
...
return module;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]