我正在製作我的第一個Python C擴展,它定義了一些函數和自定義類型。奇怪的是自定義類型正在工作,但不是常規函數。頂級mymodule.c的文件是這樣的:無法在Python 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()
我得到以下錯誤: 回溯(最近通話最後一個): 文件 「MyModuleTest.py」,9號線,在 mymodule.doStuff(緩衝) AttributeError的: '模塊'對象沒有屬性'doStuff'
這是怎麼回事?莫名其妙地在我的模塊的方法聲明中有一些錯誤?
這不是一個答案,但你看過Cython嗎?如果你在本地使用cython進行開發,你仍然可以將C代碼和你的cython代碼一起分發,並且如果用戶不想(這就是lxml是如何實現的)只在setup.py中構建c代碼。 – 2010-09-22 23:51:04