我正在制作我的第一个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(最近一次调用最后一次): 文件“MyModuleTest.py”,第9行,in mymodule.doStuff(缓冲液) AttributeError:'module'对象没有属性'doStuff'
这里发生了什么?我的模块的方法声明有什么错误吗?
答案 0 :(得分:2)
此代码有效:
from mymodule.MyCustomType import MyCustomType
绝对令人惊讶,并告诉我们mymodule
实际上是包,MyCustomType
该包中的模块(包含同名的类型或类) 。
因此,要调用该函数,您显然必须这样做:
from mymodule import MyCustomType as therealmodule
therealmodule.doStuff()
之类的 - 假设您提供给我们的信息,特别是我从您说过的代码中引用的第一行代码确实是准确的。
答案 1 :(得分:0)
如果您import mymodule
后跟print(dir(mymodule))
?
你的模块真的够大,可以分成3个文件吗?拆分确实增加了很多复杂性与链接...名称错误,也许?
AudioOutputOSX_doStuff
与MyModule_doStuff
...真正的问题,还是问题编辑问题?
什么平台,什么编译器?