【问题标题】:Passing array/tuple from python back to c++将数组/元组从 python 传递回 C++
【发布时间】:2020-03-02 10:38:03
【问题描述】:

我正在尝试将列表从 cpp 传递给 python 并将其取回。最初我试图传递一个值并取回一个值。有效。现在我正在尝试传递完整的数组/列表下面是我的 cpp 代码:

#include <iostream>
#include <Python.h>
#include <numpy/arrayobject.h>
#include <typeinfo>
using namespace std;

int main()
{
Py_Initialize();
PyObject *sys = PyImport_ImportModule("sys");
PyObject *path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyString_FromString("."));

PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;

// Build the name object
pName = PyString_FromString("mytest");

// Load the module object
pModule = PyImport_Import(pName);

// pDict is a borrowed reference 
pDict = PyModule_GetDict(pModule);

// pFunc is also a borrowed reference 
pFunc = PyObject_GetAttrString(pModule, "stuff");

if (!PyCallable_Check(pFunc))
  PyErr_Print();

PyObject *list = PyList_New (5);

Py_ssize_t size = PyList_GET_SIZE(list);

for(Py_ssize_t s = 0; s < size; s++ )
{
    PyList_SetItem(list, s, Py_BuildValue("d", 2.5));

}

PyObject* result = PyObject_CallObject(pFunc, list);
if(result==NULL)
{cout << "FAILED ..!!" << endl;}

cout << result << endl;;
return 0;
}   

我总是“失败..!!”。

这是我的 mytest.py

def stuff(a):
   x=a
   return x

有什么建议我可能会出错吗?

【问题讨论】:

    标签: python c++ linker python-embedding


    【解决方案1】:

    来自the documentation

    PyObject* PyObject_CallObject(PyObject *callable, PyObject *args)
    这相当于 Python 表达式:callable(*args)。

    PyObject_CallFunctionObjArgs 记录为:

    PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ..., NULL)
    这相当于 Python 表达式:callable(arg1, arg2, ...)。

    因此,将您的调用更改为以下内容:

    PyObject* result = PyObject_CallFunctionObjArgs(pFunc, list, NULL);
    

    (或者您可以将您的列表包装在另一个列表中并继续使用CallObject,但这是迄今为止更简单的解决方案)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      相关资源
      最近更新 更多