2016-06-27 3 views
1

파이썬 C API를 사용하여 C에서 파이썬 함수를 호출하려고합니다. 나는 PyObject_Call을 사용하여 파이썬 함수를 호출한다.이 함수는 PyObject를 리턴한다. 반환 된 PyObject가 numpy 배열 또는리스트 인 경우 어떻게 처리해야합니까? 기본적으로 C 배열로 캐스팅하거나 포인터를 꺼내려면 어떻게해야합니까?Python C API에서 반환 된 PyObject의 포인터를 얻는 방법은 무엇입니까?

다음은 코드의 개요입니다. funcnumpy.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; 
} 

... 
+1

'PyArray_CheckExact' 및'PyArray_DATA'를 확인하십시오. http://docs.scipy.org/doc/numpy/reference/c-api.array.html#c.PyArray_CheckExact 및 http://docs.scipy.org/ doc/numpy/reference/c-api.array.html # c.PyArray_DATA –

+0

@ Alok-- 그러나 'PyObject_Call'의 반환 유형은 PyArrayObject가 아닌 PyObject이므로 사용할 수 있을지 모르겠습니다. – chemicaholic

+0

'PyObject *'에서 사용하도록되어 있습니다 : 정의에 대해서는 https://github.com/numpy/numpy/blob/master/numpy/core/include/numpy/ndarrayobject.h#L35를 참조하십시오. https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/number.c#L89는'PyObject *'에 사용 된 예입니다. –

답변

0

개체가 Numpy 배열 인 경우 this이 도움이 될 것입니다. 하지만 기능을 알아야합니다 :

void* PyArray_GetPtr(PyArrayObject* aobj, npy_intp* ind) 

numpy 배열을 조작하는 데 도움이됩니다.

목록의 경우 개체를 조작하려면 this link의 기능이 필요합니다.

항목에 대한 포인터를 가져 와서 다시 C 개체로 변환 할 수 있습니다.

관련 문제