私は、いくつかの関数とカスタム型を定義する最初の 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()
そして、カスタム型の new メソッドと init メソッドからの printf() ステートメントが出力されているのがわかります。ただし、このコードは失敗します。
import mymodule
mymodule.doStuff()
次のエラーが表示されます: Traceback (most recent call last): File "MyModuleTest.py", line 9, in mymodule.doStuff(buffer) AttributeError: 'module' object has no attribute 'doStuff'
ここで何が起こっているのですか?モジュールのメソッド宣言に何らかのエラーがありますか?