2016-09-21 120 views
-1

添加動態C函數我將C函數聲明爲Python的原型如何在嵌入式Python

static PyObject* MyFunction(PyObject* self, PyObject* args) 
{ 
    return Py_None ; 
} 

現在我想將其添加到動態加載模塊

PyObject *pymod = PyImport_ImportModule("mymodule"); 
PyObject_SetAttrString(pymod, "myfunction", ?); 

如何轉換C函數到PyObject可調用?

+0

哪個版本的python? –

+0

我正在使用Python 2.7 – themadmax

回答

0

您需要從MyFunction構造一個新的PyCFunctionObject對象。通常,這是使用模塊初始化代碼引擎蓋下完成的,但你現在做相反的方式,你需要自己構建PyCFunctionObject,使用無證PyCFunction_NewPyCFunction_NewEx,以及合適的PyMethodDef

static PyMethodDef myfunction_def = { 
    "myfunction", 
    MyFunction, 
    METH_VARARGS, 
    "the doc string for myfunction" 
}; 

... 

    // Use PyUnicode_FromString in Python 3. 
    PyObject* module_name = PyString_FromString("mymodule"); 
    if (module_name == NULL) { 
     // error exit! 
    } 

    // this is adapted from code in code in 
    // Objects/moduleobject.c, for Python 3.3+ and perhaps 2.7 
    PyObject *func = PyCFunction_NewEx(&myfunction_def, pymod, module_name); 
    if (func == NULL) { 
     // error exit! 
    } 
    if (PyObject_SetAttrString(module, myfunction_def.ml_name, func) != 0) { 
     Py_DECREF(func); 
     // error exit! 
    } 
    Py_DECREF(func); 

再一次,這不是做事情的首選方式;通常一個C擴展會創建具體的模塊對象(如_mymodule),而mymodule.py會導入_mymodule並將事物放入適當的位置。

+0

Python 2中是否有NewEx? –

+0

是在methodobject.h中 – themadmax