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

Posted

技术标签:

【中文标题】在 C++ 程序中调用 Python 函数【英文标题】:Calling a Python function within a C++ program 【发布时间】:2013-08-26 17:22:26 【问题描述】:

我有一个真正简单的 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 但这不起作用。有什么想法吗?

【问题讨论】:

你看Boost.Python了吗? 是的,但是如果没有 Boost、SWIG 等,如何做到这一点。 【参考方案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 解释器来处理。

【讨论】:

以上是关于在 C++ 程序中调用 Python 函数的主要内容,如果未能解决你的问题,请参考以下文章

通过 Boost Python 将 Python 函数转换为 C++,用作回调

Python - 函数的输出? [复制]

ROS工程中C++调用python函数

从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?

从 C++ 调用 Python

在 C++ 程序中调用 Cython (Python3.6)