gpt4 book ai didi

python - C++ 调用带有多个参数的 Python 函数

转载 作者:行者123 更新时间:2023-11-30 03:20:37 25 4
gpt4 key购买 nike

我想用 python.h 在 C++ 中调用 Python 函数,但是有一些问题。

这是我的 Python 函数示例

def function1(tuple1, tuple2, string1, string2 ,string3, double1, string4 = ""):
...

和 C++ 示例

double function_adapter(const vector<double> &vec1, const vector<double> &vec2, const string &string1, const string &string2, const string &string3, const double double1, const string &string4)
{
Py_Initial();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append(\"./\")");
PyObject *pModule, *pFunc, *pRes;
pModule = PyImport_Import(PyString_FromString("PythonFile"));
pFunc = PyObject_GetAttrString(pModule, "function1");
PyObject *pArgs = PyTuple_New(7);
PyObject *pVec1 = PyTuple_New(vec1.size());
for(size_t i = 0; i < vec1.size(); ++i) {
PyTuple_SetItem(pVec1, i, Py_BuildValue("f", vec1[i]));
}
PyObject *pVec2 = PyTuple_New(vec2.size());
for(size_t i = 0; i < vec2.size(); ++i) {
PyTuple_SetItem(pVec2, i, Py_BuildValue("f", vec2[i]));
}
PyObject *pString1 = Py_BuildValue("s", string1);
PyObject *pString2 = Py_BuildValue("s", string2);
PyObject *pString3 = Py_BuildValue("s", string3);
PyObject *pDouble1 = Py_BuildValue("f", double1);
PyObject *pString4 = Py_BuildValue("s", string4);
PyTuple_SetItem(pArgs, 0, pVec1);
PyTuple_SetItem(pArgs, 1, pVec2);
PyTuple_SetItem(pArgs, 2, pString1);
PyTuple_SetItem(pArgs, 3, pString2);
PyTuple_SetItem(pArgs, 4, pString3);
PyTuple_SetItem(pArgs, 5, pDouble1);
PyTuple_SetItem(pArgs, 6, pString4);

pRes = PyObject_CallObject(pFunc, pArgs);
if(pRes == NULL) {
return -2;
}
int res = PyLong_AsLong(pRes);

Py_DecRef(pModule);
.
.
.

Py_Finalize();
return res;
}

但是 pRes 返回 NULL。 PyObject_CallObject 就像一个黑盒子,我无法介入查看它是如何工作的。

所以我想问一下我的代码有什么问题吗?

参数准备是否正确? (网上很少有这种情况的例子。)

最佳答案

返回 NULL 的 CPython API 函数意味着发生了错误。您可以使用 PyErr_*查询此异常的一组 API 函数。

对于调试,最有用的可能是 PyErr_Print(),它只会将异常和堆栈跟踪(如果有)打印到 stderr。

确保仔细检查 pModulepFunc 不为 NULL。尝试导入模块或从模块中获取功能时可能发生了异常。 CPython 不会引发异常,它只是在出错时返回 NULL。因此检查 C-API 函数的返回值很重要。

关于python - C++ 调用带有多个参数的 Python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52777840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com