从 C++ 调用的 python 方法返回列表
Posted
技术标签:
【中文标题】从 C++ 调用的 python 方法返回列表【英文标题】:Returning list from python method called from C++ 【发布时间】:2016-03-04 16:46:59 【问题描述】:我正在尝试从 C++ 代码调用 Python 方法,而我正在调用的方法将文件名作为参数返回一个列表。
我的示例代码当前将方法调用的 PyObject* 结果转换为双精度,但我想将其转换为列表。
#include "include.h"
int main(int argc, char* argv[])
double answer = 0;
PyObject *modname, *mod, *mdict, *func, *stringarg, *args, *result;
Py_Initialize();
PyRun_SimpleString("import sys");
modname = PyUnicode_FromString("module");
mod = PyImport_Import(modname);
if (!mod)
PyErr_Print();
exit(1);
mdict = PyModule_GetDict(mod);
func = PyDict_GetItemString(mdict, "func");
if (!func)
printf("function does not exist\n");
stringarg = PyUnicode_FromString("test.txt");
args = PyTuple_New(1);
PyTuple_SetItem(args, 0, stringarg);
result = PyObject_CallObject(func, args);
if (result)
answer = PyFloat_AsDouble(result);
Py_XDECREF(result);
Py_XDECREF(stringarg);
Py_XDECREF(args);
Py_XDECREF(mod);
Py_XDECREF(modname);
Py_Finalize();
return 0;
我该怎么做呢?我已经看到了创建作为参数传递的列表对象的包装类示例,但我还没有看到将返回值转换为列表的示例。
【问题讨论】:
转换为列表是什么意思?现在看起来你假设它返回一个float
。你只想得到那个浮动的列表吗?
正如我所说“我的示例代码当前将 PyObject* 结果转换为双精度,但我想将其转换为列表”。
当我要求澄清你的问题时,我并不是要你逐字引用我要求澄清的部分。将双精度数转换为列表对您意味着什么?
没什么,这是一个无用的转换,所以我不想这样做。
那么你的问题是什么?您正在尝试解决但无法解决的问题是什么?你想用result
做什么?
【参考方案1】:
您正在寻找 API 的 List Objects 部分:
result = PyObject_CallObject(func, args);
if (PyList_Check(result))
// okay, it's a list
for (Py_ssize_t i = 0; i < PyList_Size(result); ++i)
PyObject* next = PyList_GetItem(result, i);
// do something with next
【讨论】:
以上是关于从 C++ 调用的 python 方法返回列表的主要内容,如果未能解决你的问题,请参考以下文章
使用 c++ boost::python 从 python 函数返回的列表中获取数据?
python 调用c++程序, c++程序如何返回数组给python