从 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 函数返回的列表中获取数据?

C++ DLL 返回从 Python 调用的指针

python 调用c++程序, c++程序如何返回数组给python

从 swig 返回 double * 作为 python 列表

从python返回一个数组到C++

PyObject_GetAttrString C++ 函数返回 NULL:无法从 C++ 调用 Python 函数