从C++调用Python方法返回列表

2024-04-25 02:07:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从C++代码中调用Python方法,而我调用的方法将文件名作为参数返回列表。在

我的示例代码当前将方法调用的PyObject*结果转换为double,但我希望将其转换为list。在

#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;
   }

我该怎么做呢?我见过一些包装类的示例,它们创建作为参数传递的列表对象,但没有看到将返回值转换为列表的示例。在


Tags: 方法代码pymod示例列表ifargs
1条回答
网友
1楼 · 发布于 2024-04-25 02:07:42

您正在查找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
    }
}

相关问题 更多 >