Python Code ================================ import mymodule m = mymodule.MyModule() sub = m.create() sub.test() ================================= #include "mymodmodule.h" #include 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); } ============= Use this command to build it python setup.py build_ext -i ============= from distutils.core import setup, Extension module1 = Extension('mymodule', sources = ['mymodmodule.c']) setup (name = 'mymodule', version = '1.0', description = 'This is a test package', ext_modules = [module1]) ======