在C++程序中调用Python函数
Calling a Python function within a C++ program
我有一个真正简单的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解释器来处理。
相关文章:
- 使用C++指针调用 python 函数
- 使用 pybind11 调用 Python 函数时避免复制输入数据
- 从 C++ 函数与 Python 函数返回的不一致值用于偏斜正态分布
- 如何使用 pybind11 将 python 函数保存到静态 c++ 容器中?
- 在 cpp 中嵌入 python:如何获取指向 python 函数(而不是 PyObject)的 C 指针?
- 困在PyObject_GetAttrString():如何从C++代码中获取Python函数脚本
- 如何通过C++在Python函数中传递字符串参数
- 在 C 代码中调用 Python 函数时第三次出现访问冲突写入位置错误
- 通过 Boost Python 将 Python 函数转换为 C++,用作回调
- 获取 C++ 中的 Python 函数参数名称
- 使用来自C++的任意数量的参数(在编译时未知)调用 Python 函数
- 如何从Qt C++项目运行Python函数
- 如何从 c++ 调用另一个文件中定义的 python 函数?
- 无法理解提升 python 函数导出中的语法
- 执行 c++ 中字符串中提供的 Python 函数
- 使用 pybind11 从 C++ 调用 Python 函数
- 从C 中的多个线程调用Python函数
- 使用 C++ 中的 python 函数
- 如何使用 pybind11 将 python 函数转换为 std::function
- TensorFlow:可用的Python函数的C++等价物