Ich habe versucht, ein Array von C nach Python übergeben und eine einfache arithmetische Operation numpy.prod
durchzuführen, aber einen Segmentierungsfehler festgestellt. Könnte mir jemand helfen, aufzuzeigen, wo ich schief gelaufen bin? Vielen Dank!Python C API Segmentierungsfehler
#include <Python.h>
#include <stdio.h>
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#include "/share/apps/anaconda2/pkgs/numpy-1.10.4-py27_1/lib/python2.7/site-packages/numpy/core/include/numpy/arrayobject.h"
double Array[4] = {1.0, 2.0, 3.0, 4.0};
double call_func(PyObject *func, double array[]){
PyObject *args;
PyObject *kwargs;
PyObject *result;
npy_intp dims[1] = {4};
double retval;
PyGILState_STATE state = PyGILState_Ensure();
if (!PyCallable_Check(func)){
printf("%s", "Function is not callable!\n");
}
args = PyArray_SimpleNewFromData(1, dims, NPY_FLOAT32, array);
kwargs = NULL;
result = PyObject_Call(func, args, kwargs);
Py_DECREF(args);
Py_XDECREF(kwargs);
if (PyErr_Occurred()){
PyErr_Print();
}
if (!PyFloat_Check(result)){
printf("%s", "Callable did not return a float!");
}
retval = PyFloat_AsDouble(result);
Py_DECREF(result);
PyGILState_Release(state);
return retval;
}
PyObject *import_name(const char *modname, const char *symbol){
PyObject *mymodule = PyImport_ImportModule(modname);
return PyObject_GetAttrString(mymodule, symbol);
}
void main(){
PyObject *myfunc;
double retval;
import_array();
Py_Initialize();
myfunc = import_name("numpy", "prod");
retval = call_func(myfunc, Array);
Py_DECREF(myfunc);
printf("%d\n", retval);
Py_Finalize();
}
(ich folgte das Verfahren auf dieser Website http://blog.numerix-dsp.com/2013/08/how-to-pass-c-array-to-python-solution.html?m=1.)
Ich sehe nicht, warum es einen segfault verursachen würde, aber die Argumente zu Ihrem 'PyArray_SimpleNewFromData()' Aufruf sehen falsch aus. 'array' ist ein Array von' double's, aber Sie verwenden den Typcode 'NPY_FLOAT32'. Sicherlich wollen Sie 'NPY_DOUBLE' oder (gleichwertig)' NPY_FLOAT64'. –