rendered paste body#include "mymodmodule.h"
#include <Python/Python.h>
typedef struct {
PyObject_HEAD
PyObject *member1;
} MySubModuleObject;
// public members
//static PyMemberDef MyModule_members[] = {
// {"member1", T_OBJECT_EX, offsetof(MyModuleObject, member1), 0, "member1 text"},
// {NULL} // Sentinel
//};
// initialize the module
static int MySubModule_init(MySubModuleObject *self, PyObject *args, PyObject *kwds) {
return 0;
}
// destroy
static int MySubModule_dealloc(MySubModuleObject *self) {
return 0;
}
static PyObject *MySubModule_test(MySubModuleObject *self) {
printf("MySubModule_test\n");
return Py_None;
}
// public methods
static PyMethodDef MySubModule_methods[] = {
{"test", (PyCFunction)MySubModule_test, METH_NOARGS, "test."},
{NULL}
};
static char MySubModule_doc[] =
"MySubModule.";
static PyTypeObject MySubModuleObjectType = {
PyObject_HEAD_INIT(NULL)
0, /* ob_size */
"mymodule.MySubModule", /* tp_name */
sizeof(MySubModuleObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)MySubModule_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
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, /* tp_flags */
MySubModule_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
MySubModule_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc)MySubModule_init, /* tp_init */
};
typedef struct {
PyObject_HEAD
PyObject *member1;
} MyModuleObject;
// public members
//static PyMemberDef MyModule_members[] = {
// {"member1", T_OBJECT_EX, offsetof(MyModuleObject, member1), 0, "member1 text"},
// {NULL} // Sentinel
//};
// initialize the module
static int MyModule_init(MyModuleObject *self, PyObject *args, PyObject *kwds) {
return 0;
}
// destroy
static int MyModule_dealloc(MyModuleObject *self) {
return 0;
}
static PyObject *MyModule_create(MyModuleObject *self) {
printf("MyModule_create\n");
PyObject *my_module = PyImport_ImportModule("mymodule");
PyObject *my_class = PyObject_GetAttrString(my_module, "MySubModule");
if(!my_class) return NULL;
PyObject *m = PyInstance_New(my_class, NULL, NULL);
printf("m=%08x\n", m);
return m;
}
// public methods
static PyMethodDef MyModule_methods[] = {
{"create", (PyCFunction)MyModule_create, METH_NOARGS, "create."},
{NULL}
};
static char MyModule_doc[] =
"MyModule.";
static PyTypeObject MyModuleObjectType = {
PyObject_HEAD_INIT(NULL)
0, /* ob_size */
"mymodule.MyModule", /* tp_name */
sizeof(MyModuleObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)MyModule_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
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, /* tp_flags */
MyModule_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
MyModule_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
(initproc)MyModule_init, /* tp_init */
};
// Initialize the module
PyMODINIT_FUNC initmymodule(void) {
PyObject* m;
MyModuleObjectType.tp_new = PyType_GenericNew;
if(PyType_Ready(&MyModuleObjectType) < 0) return;
m = Py_InitModule3("mymodule", NULL, "XXX");
if(m == NULL) return;
Py_INCREF(&MyModuleObjectType);
PyModule_AddObject(m, "MyModule", (PyObject *)&MyModuleObjectType);
MySubModuleObjectType.tp_new = PyType_GenericNew;
if(PyType_Ready(&MySubModuleObjectType) < 0) return;
// m = Py_InitModule3("mymodule", NULL, "XXX");
// if(m == NULL) return;
Py_INCREF(&MySubModuleObjectType);
PyModule_AddObject(m, "MySubModule", (PyObject *)&MySubModuleObjectType);
}