在C++程序中调用Python函数

Calling a Python function within a C++ program

本文关键字:Python 函数 调用 C++ 程序      更新时间:2023-10-16

我有一个真正简单的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)中获取指针,并将其传递给一个预期为double(*fx)(double)的C++函数。有人知道怎么做吗(如果可能的话)?我尝试初始化double(*cFx)(double)并将Python函数强制转换为cFx = (double(*)(double))Fx,但这不起作用。有什么想法吗?

您将无法像那样简单地将Python函数转换为C。

相反,传递PyObject函数指针,调用该函数,然后转换为C双精度。此代码将在出现故障时返回-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解释器来处理。