Я работаю над созданием моего первого расширения Python C, которое определяет несколько функций и пользовательских типов.Странно то, что работают пользовательские типы, а не обычные функции.Файл верхнего уровня MyModule.c выглядит следующим образом:
static PyMethodDef MyModule_methods[] = {
{"doStuff", MyModule_doStuff, METH_VARARGS, ""},
{NULL, NULL, 0, NULL} /* Sentinel */
};
static struct PyModuleDef MyModule_module = {
PyModuleDef_HEAD_INIT,
"mymodule",
"Documentation",
-1,
MyModule_methods
};
PyMODINIT_FUNC PyInit_audioDevice(void) {
PyObject *object = PyModule_Create(&MyModule_module);
if(object == NULL) {
return NULL;
}
if(PyType_Ready(&MyCustomType_type) < 0) {
return NULL;
}
Py_INCREF(&MyCustomType_type);
PyModule_AddObject(object, "MyCustomType", (PyObject*)&MyCustomType_type);
return object;
}
Я создаю расширение с помощью этого файла setup.py:
from distutils.core import setup, Extension
setup(name = "mymodule",
version = "1.0",
ext_modules = [Extension("mymodule", ["MyModule.c", "MyCustomType.c", "DoStuff.c"])])
Файл "DoStuff" определяет егофункция как таковая:
static PyObject*
AudioOutputOSX_doStuff(PyObject *self, PyObject *args) {
printf("Hello from doStuff\n");
return Py_None;
}
Самое смешное, что тип MyCustomType работает нормально, я могу создать его с помощью:
from mymodule.MyCustomType import MyCustomType
foo = MyCustomType()
И я вижу свои операторы printf () изновый пользовательский тип и методы init распечатаны.Однако этот код завершается ошибкой:
import mymodule
mymodule.doStuff()
Я получаю следующую ошибку: Traceback (последний вызов был последним): файл «MyModuleTest.py», строка 9, в mymodule.doStuff (buffer) AttributeError: 'module'У объекта нет атрибута' doStuff '
Что здесь происходит?Есть ли какие-то ошибки в объявлениях моего модуля как-то?