2014-10-06 5 views
0

일부 파이썬 개체를 만들고 C++에서 NumPy를 사용하려고합니다. 내가 찾은 몇 가지 예를 수정했습니다. 아래 코드는 NumPy 모듈, numpy.array 함수를 찾고 pValue에 null을 반환합니다. 나는 파이썬 3.4를 사용했다. 누구든지 함수가 항상 NULL을 반환하는 이유에 대해 알려줄 수 있습니까?null을 반환하는 c-api 함수

#include <stdlib.h> 
#include <iostream> 
#include <vector> 
#include <Python.h> 
int runPython(int argc, char * argv[]) { 

    std::cout << "Hello from runPython()" << std::endl; 
    PyObject *pFunc; 
    PyObject *pValue, *pYVec; 
    int i; 

    Py_Initialize(); 

    std::cout << Py_GetVersion() << std::endl; 

    PyObject *sys = PyImport_ImportModule("sys"); 
    PyObject *path = PyObject_GetAttrString(sys, "path"); 
    std::cout << PyList_Size(path) << std::endl; 
    Py_DecRef(path); 
    Py_DecRef(sys); 

    PyObject* item = PyList_GetItem(path,1); 
    std::cout << PyString_Check(item) << std::endl; 
    Py_DecRef(item); 

    PyObject *numpy = PyImport_ImportModule("numpy"); 

    if (numpy != NULL) { 
     pFunc = PyObject_GetAttrString(numpy, "array"); //Get the function by its name 
     if (pFunc && PyCallable_Check(pFunc)) { 
      static const double yarr[] = {0,0,1,1,0,0,2,2,0,0,1,1,0,0}; 
      std::vector<double> yvec (yarr, yarr + sizeof(yarr)/sizeof(yarr[0])); 

      //Transfer the other C++ vector to a python list 
      pYVec = PyList_New(yvec.size()); 
      for (i = 0; i < yvec.size(); ++i) { 
       pValue = PyFloat_FromDouble(yvec[i]); 
       if (!pValue) { 

        fprintf(stderr, "Cannot convert array value\n"); 
        return 1; 
       } 
       PyList_SetItem(pYVec, i, pValue); // 
      } 

      //Call the python function 
      pValue = PyObject_CallMethodObjArgs(pFunc, pYVec); 
      if (pValue != NULL) { 
       printf("Result of call: %ld\n", PyInt_AsLong(pValue)); 
      } 
      //Some error catching 
      else { 
       Py_DecRef(pValue); 
       Py_DecRef(pYVec); 
       //Py_DecRef(pFunc); 

       Py_XDECREF(pFunc); 
       Py_DecRef(numpy); 
       fprintf(stderr,"Call failed\n"); 
       PyErr_Print(); 

       return 1; 
      } 
     } 
     else { 
      if (PyErr_Occurred()) 
       PyErr_Print(); 
      fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]); 
     } 
     //Py_DECREF(pModule); 
    } 
    else { 
     PyErr_Print(); 
     fprintf(stderr, "Failed to load \"%s\"\n", argv[1]); 
     return 1; 
    } 
    Py_Finalize(); 
    return 0; 
} 

int main (int argc, char *argv[]) 
{ 
    std::cout << "Hello from main" << std::endl; 
    runPython(argc, argv); 
    std::cout << "Program finished" << std::endl; 
    return EXIT_SUCCESS; 
} 

PyObject_CallMethodObjArgs

Hello from main 
Hello from runPython() 
3.4.0 (default, Apr 11 2014, 13:08:40) 
[GCC 4.8.2] 
7 
0 
Call failed 
Program finished 
+0

@matsjoyce 시도 - 나는 도서관에서 모습을 했어하지만 많은 문서있을 것 같지 않습니다. SSCE가 있으십니까? –

답변

0

귀하의 인수가 올바르지 않은 출력을 생성합니다. 사실, 나는 당신이 잘못된 기능을 부르고 있다고 생각합니다. PyObject_CallFunctionObjArgs이 더 적합 해 보입니다. 대신

pValue = PyObject_CallMethodObjArgs(pFunc, pYVec); 

pValue = PyObject_CallFunctionObjArgs(pFunc, pYVec, NULL);