【发布时间】:2016-06-27 17:03:29
【问题描述】:
我正在尝试使用 Python C API 在 C 中调用 Python 函数。我使用PyObject_Call 调用返回PyObject 的Python 函数。如果返回的 PyObject 是一个 numpy 数组或列表,那么我应该如何处理它?基本上如果我想把它转换成一个C数组,或者只是把指针取出来,我该怎么做呢?
这里是代码的概要。 func 是 numpy.power。
double Array[4] = {1.0, 2.0, 3.0, 4.0};
int Integer = 2;
double *call_func(PyObject *func, double array[], int integer){
PyObject *args;
PyObject *kwargs;
PyObject *result;
npy_intp dims[1] = {4};
double *retval;
PyGILState_STATE state = PyGILState_Ensure();
args = Py_BuildValue("(Od)", PyArray_SimpleNewFromData(1, dims, NPY_DOUBLE, Array), integer);
kwargs = NULL;
result = PyObject_Call(func, args, kwargs);
Py_DECREF(args);
Py_XDECREF(kwargs);
retval = ???
Py_DECREF(result);
PyGILState_Release(state);
return retval;
}
...
【问题讨论】:
-
查看
PyArray_CheckExact和PyArray_DATAdocs.scipy.org/doc/numpy/reference/… 和docs.scipy.org/doc/numpy/reference/… -
@Alok-- 但我从
PyObject_Call的返回类型是 PyObject 而不是 PyArrayObject 所以我不知道我是否可以使用它。 -
它应该用于
PyObject *:有关定义,请参见github.com/numpy/numpy/blob/master/numpy/core/include/numpy/…。 github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/… 是在PyObject *上使用的一个示例。 -
@Alok-- 我试过了,但它确实需要
PyArrayObject *。错误跟随passing argument 1 of ‘PyArray_DATA’ from incompatible pointer type /share/apps/anaconda2/pkgs/numpy-1.10.4-py27_1/lib/python2.7/site-packages/numpy/core/include/numpy/ndarraytypes.h:1437: note: expected ‘struct PyArrayObject *’ but argument is of type ‘struct PyObject *’ -
@Alok-- 我认为这不是错误而是警告。应该没问题的。
标签: c numpy python-c-api