我有一个简单的Python函数:
def myfunc(x):
return 2.0 * x
我想将此函数发送到C ++程序并调用它,所以我已经这样做了:
#include "Python.h"
static PyObject *execMyPyFunc(PyObject *self, PyObject *args) {
PyObject *Fx, *pyresult;
double x;
PyArg_ParseTuple(args, "dO", &x, &Fx);
pyresult = PyObject_CallFunction(Fx, "d", x);
return pyresult;
}
static PyMethodDef C_API_TestMethods[] = {
{"execMyPyFunc", execMyPyFunc, METH_VARARGS, "Add documentation here.."},
{NULL, NULL}
};
PyMODINIT_FUNC initC_API_Test(void) {
Py_InitModule("C_API_Test", C_API_TestMethods);
}
我的Python程序正常工作:
from C_API_Test import execMyPyFunc
def myfunc(x):
return 2.0 * x
fx = execMyPyFunc(1.28,myfunc)
print fx
我想做的是以某种方式从我的Python函数(PyObject *Fx
)获取指针并将其传递给C ++函数,期望:double(*fx)(double)
。有谁知道怎么做(如果可能的话)?我尝试初始化double(*cFx)(double)
并将我的Python函数强制转换为cFx = (double(*)(double))Fx
,但这不起作用。有什么想法吗?
答案 0 :(得分:1)
你不可能像这样简单地将Python函数转换为C.
而是传递PyObject函数指针,调用函数,并转换为C double。该代码将在失败时返回-1
。
static double cFx(PyObject *fx, double x){
PyObject *pyresult = PyObject_CallFunction(fx, "d", x);
if (pyresult == NULL) return -1;
double cppresult = PyFloat_AsDouble(pyresult);
Py_DECREF(pyresult);
if (PyErr_Occurred()) return -1;
return cppresult;
}
这一点的重要部分是将引用计数减少到PyObject_CallFunction
的返回值,因为您没有将它传递给Python解释器来处理。