[PyQt] SIP Pointer Confusion

Phil Thompson phil at riverbankcomputing.com
Fri Sep 30 01:58:46 BST 2016


On 30 Sep 2016, at 1:43 am, Jay L. <jlaura at asu.edu> wrote:
> 
> Just starting to dig into SIP. I have a .h file that contains the following public method:
> 
> void Allocate(int width, int height, int pitch, bool withHost, float *devMem = NULL, float* hostMem = NULL); 
> 
>  have created a corresponding .sip file:
> 
> 1 //SIP wrapper for CUDA Image 
> 2 
> 3 class CudaImage 
> 4 { 
> 5 %TypeHeaderCode 
> 6 #include "cudaImage.h" 
> 7 %End 
> 8 
> 9 public: 
> 10 CudaImage(); 
> 11 
> 12 void Allocate(int width, int height, int pitch, bool withHost, float *devMem=NULL, float *hostMem=NULL) /KeywordArgs="All"/; 
> 13 double Download(); 
> 14 
> 15 
> 16 int width; 
> 17 int height; 
> 18 int pitch; 
> 19 };
> 
> Using CMake, I have the build working, can import the module into Python and can call the constructor (so limited success). I can also call the Allocate method. Unfortunately, on the Python side, I can not get the float *devMem=NULL or float *hostMem=Nullarguments exposed. I have been over the SIP documentation and no Annotations are leaping out as missing.
> 
> The ultimate goal is to pass a numpy array (.data attribute I believe) to the hostMemargument.
> 
> How does one go about exposing pointers in SIP? What about pointers with a default, NULL, argument?

Pointers to fundamental types are (by default) treated as a way to return a value from the method and not pass a value to it - see the /In/ annotation.

You should then hit the problem that you will have to provide hand-written code to handle those arguments because SIP doesn't know how to convert them to a Python object. You probably need to declare the types as SIP_PYOBJECT and handle the conversion in %MethodCode. Alternatively if that is a common situation in your API then consider defined a mapped type.

If numpy arrays support the buffer protocol then you should look at exploiting that. You should also look at sip.array and sipConvertToArray().

Phil


More information about the PyQt mailing list