2010-09-22 29 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 ......一個真正的問題,或只是一個問題編輯問題?

什麼平臺,什麼編譯器?