Вызов функции Python в программе на C ++

У меня есть очень простая функция 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

Решение

Вы не сможете просто привести функцию 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, чтобы иметь с ним дело.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]