尝试传递数组时,PyObject_CallObject 返回 NULL

问题描述

我试图将二维数组从 C++ 传递给 Python 函数,但 PyObject_CallObject 函数返回 NULL。这种情况也发生在一维数组的情况下。当我不传递任何参数或者参数只是单个变量而不是数组时,它工作正常。我的代码如下:

#include <stdio.h>
#include <Python.h>
#include <pyhelper.hpp>
#include <string>
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include <numpy/arrayobject.h> // For capturing the output values given by detector Python inference code

using namespace std;

PyObject *PythonInitialize(string script_name,string function_name);

int main(int argc,char *argv[])
{

    if (!Py_IsInitialized())
    {
        Py_InitializeEx(0); // Initialize the Python interpreter
    }

    PyObject *PythonDetectorFunction,*PythonDetectorFunctionArguments;
    PythonDetectorFunction = PythonInitialize("test","getsum"); //getint,getsum

    PythonDetectorFunctionArguments = PyTuple_New(1); // Reference count incremented. Need to handle the reference counting
    if (PythonDetectorFunctionArguments == NULL)
        PyErr_Print();

    if (PyArray_API == NULL)
    {
        import_array();
    }

    float data[2][4] = {{1.2,3.4,5.6,7.8},{1.2,7.8}};
    npy_intp dims[2] = {2,4};

    PythonDetectorFunctionArguments = PyArray_SimpleNewFromData(1,dims,NPY_FLOAT,data);

    PyObject *PythonDetectorFeatureMaps = PyObject_CallObject(PythonDetectorFunction,PythonDetectorFunctionArguments); // Will contain the output given by Python code

    if (PythonDetectorFeatureMaps != NULL)
        printf("PythonDetectorFeatureMaps: %p\n",PythonDetectorFeatureMaps);
    else
        printf("PythonDetectorFeatureMaps is NULL.\n");

    Py_DECREF(PythonDetectorFunction);
    Py_DECREF(PythonDetectorFunctionArguments);
    //Py_DECREF(PythonDetectorFeatureMaps);
}

PyObject *PythonInitialize(string script_name,string function_name)
{
    PyObject *pName,*pModule,*pFunc;
    string PythonCodeImportStatement = "sys.path.append(os.getcwd())";
    PyRun_SimpleString("import sys,os");
    PyRun_SimpleString(PythonCodeImportStatement.c_str()); // Relative path for the python code

    // pNmae is the name of the python script/module to be called
    pName = PyUnicode_FromString(script_name.c_str()); // Reference count incremented. Need to handle the reference counting
    if (pName == NULL)
        PyErr_Print();

    // Getting the Python module reference inside of the C code
    pModule = PyImport_Import(pName);
    if (pModule == NULL)
        PyErr_Print();

    // Python function reference
    pFunc = PyObject_GetAttrString(pModule,function_name.c_str()); // Reference count incremented. Need to handle the reference counting
    if (pFunc == NULL)
        PyErr_Print();

    // Refrence count clean-up
    Py_XDECREF(pName);
    Py_XDECREF(pModule);
    //Py_XDECREF(pFunc);
    return pFunc;
}

test.py 中的 Python 函数

def getsum(tuple1):
    print('Python function getsum() called')
    return None

有人能指出错误吗?

解决方法

PyObject_CallObject 接受一个可调用对象和一个可调用对象的参数元组,或者 NULL 表示没有参数。您正在尝试将 NumPy 数组而不是参数元组传递给它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...