how to deal with the PyObject* from C++ in Python

前端 未结 3 703
粉色の甜心
粉色の甜心 2021-01-03 09:06

I create DLL wrote in C++ , the exporting function returns PyObject * .Then I use ctypes to import the DLL in Python . Now , how can I get the real PyObject ??

here

3条回答
  •  隐瞒了意图╮
    2021-01-03 10:11

    You have a number of issues of your code, some modifications:

    #include 
    #include 
    
    extern "C" PyObject* _stdcall getList(){
      PyObject *PList = PyList_New(0);
    
      std::vector  intVector;
      std::vector::const_iterator it;
    
      for(int i = 0 ; i < 10 ; i++){
        intVector.push_back(i);
      }
    
      for(it = intVector.begin(); it != intVector.end() ; it++ ){
        PyList_Append(PList, Py_BuildValue("i", *it));
      }
    
      return PList;
    }
    

    compile it:

    > g++ -Wall -shared lib.cpp -I \Python27\include -L \Python27\libs -lpython27 -o lib.dll -Wl,--add-stdcall-alias
    

    now you can load it as any function and set the getList return type to py_object as:

    import ctypes
    
    lib = ctypes.WinDLL('lib.dll')
    
    getList = lib.getList
    getList.argtypes = None
    getList.restype = ctypes.py_object
    
    getList()
    

    test it:

    >>> import ctypes
    >>>
    >>> lib = ctypes.WinDLL('lib.dll')
    >>>
    >>> getList = lib.getList
    >>> getList.argtypes = None
    >>> getList.restype = ctypes.py_object
    >>> getList()
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>>
    >>>
    

提交回复
热议问题