2010-09-22 60 views
0

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

这是怎么回事?莫名其妙地在我的模块的方法声明中有一些错误?

+2

这不是一个答案,但你看过Cython吗?如果你在本地使用cython进行开发,你仍然可以将C代码和你的cython代码一起分发,并且如果用户不想(这就是lxml是如何实现的)只在setup.py中构建c代码。 – 2010-09-22 23:51:04

回答

2

,这个代码工作的事实:

from mymodule.MyCustomType import MyCustomType 

绝对是惊人的,它告诉我们mymodule实际上是一个,并MyCustomType该包内的模块(其中包含由同一个类型或类名称)。

因此,要调用的函数,你会明显地需要做的:

from mymodule import MyCustomType as therealmodule 
therealmodule.doStuff() 

或类似 - 假设你给我们的信息,特别是第一行代码,我已经从报价你说的代码工作,确实是确切的。

0

你是否看到如果你做import mymodule其次print(dir(mymodule))

您的模块是否足够大,可以分成3个文件?拆分确实会增加链接的复杂性...名称 - 可能吗?

AudioOutputOSX_doStuffMyModule_doStuff ......一个真正的问题,或只是一个问题编辑问题?

什么平台,什么编译器?