我正在制作我的第一个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