PyObject_CallObject 尝试传递数组时返回 NULL
PyObject_CallObject is returning NULL when trying to pass an array
我正在尝试将二维数组从 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, 3.4, 5.6, 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;
}
Python 中的函数 test.py:
def getsum(tuple1):
print('Python function getsum() called')
return None
谁能指出错误?
PyObject_CallObject
接受一个可调用对象和一个参数元组作为可调用对象,或者 NULL 表示没有参数。您正在尝试向它传递 NumPy 数组而不是参数元组。
我正在尝试将二维数组从 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, 3.4, 5.6, 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;
}
Python 中的函数 test.py:
def getsum(tuple1):
print('Python function getsum() called')
return None
谁能指出错误?
PyObject_CallObject
接受一个可调用对象和一个参数元组作为可调用对象,或者 NULL 表示没有参数。您正在尝试向它传递 NumPy 数组而不是参数元组。