Не удается вызвать метод в расширении Python C - PullRequest
0 голосов
/ 23 сентября 2010

Я работаю над созданием моего первого расширения 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 '

Что здесь происходит?Есть ли какие-то ошибки в объявлениях моего модуля как-то?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2010

Тот факт, что этот код работает:

from mymodule.MyCustomType import MyCustomType

абсолютно удивителен и говорит нам, что mymodule на самом деле пакет , а MyCustomType модуль в этом пакете (который содержит тип или класс с тем же именем).

Поэтому, чтобы вызвать функцию, вам, очевидно, придется сделать:

from mymodule import MyCustomType as therealmodule
therealmodule.doStuff()

или что-то подобное - при условии, что вы дадите нам информацию, особенно ту первую строку кода, которую яцитата из кода, который вы говорите работает, это действительно точно.

0 голосов
/ 23 сентября 2010

Что вы увидите, если выполните import mymodule, а затем print(dir(mymodule))?

Действительно ли ваш модуль достаточно большой, чтобы разделить его на 3 файла?Расщепление добавляет много сложностей со связыванием ... искажение имен, возможно?

AudioOutputOSX_doStuff против MyModule_doStuff ... реальная проблема или просто проблема редактирования вопроса?

Какая платформа, какой компилятор?

...