【问题标题】:Returning list from python method called from C++从 C++ 调用的 python 方法返回列表
【发布时间】: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做什么?

标签: python c++ python-c-api


【解决方案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
    }
}

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 2011-03-18
    • 2020-09-05
    • 1970-01-01
    • 2011-03-12
    • 2021-04-22
    • 2015-06-25
    相关资源
    最近更新 更多