I want to suggest a small change to pyusb to improve speed.
Currently you can only provide an array.array buffer to put the USB data into.
I use the multiprocessing feature and the final destination of the USB data is a mmap.mmap
Object. I would like to specify this as a receive buffer to save a pickle and
unpickle operation.
I use the multiprocessing feature and the final destination of the USB data is a mmap.mmap
Object. I would like to specify this as a receive buffer to save a pickle and
unpickle operation.
It is not so difficult to use the pyapi.PyObject_GetBuffer function to retrieve address and length
of any buffer protocol compliant object.
of any buffer protocol compliant object.
So this array restriction should be lifted, I assume there are more users who would
appreciate this change. I would not like to distribute my software with a modified pyusb.
appreciate this change. I would not like to distribute my software with a modified pyusb.
Sincerely
Hermann Hamann
Hermann Hamann
Here follows the modifications I made:
-----------------------------------------
# in backend1.py, similar for other backends
from ctypes import *
from struct import unpack
from struct import unpack
getBuffer = pythonapi.PyObject_GetBuffer
getBuffer.argtypes = [py_object, c_void_p, c_int]
view = create_string_buffer(11*sizeof(int))
def getBufferInfo(someObject):
pointer_to_sO = py_object(someObject)
result = getBuffer(pointer_to_sO,view,1) # flag writeable
### this call can raise an Exception. However this would be a consequence
### of an invalid caller, so no recovery is possible and simply let it
### crash, the message is helpful.
if result != 0 : return None,None
bufadr,objadr,buflen,itemsize,readonly,ndim,bformat,shape,strides,\
suboffsets,internal = unpack("11I",view)
result = pythonapi.PyBuffer_Release(string_buffer)
### of an invalid caller, so no recovery is possible and simply let it
### crash, the message is helpful.
if result != 0 : return None,None
bufadr,objadr,buflen,itemsize,readonly,ndim,bformat,shape,strides,\
suboffsets,internal = unpack("11I",view)
result = pythonapi.PyBuffer_Release(string_buffer)
return (bufadr,buflen)
# and some lines later
# and some lines later
def __read(self, fn, dev_handle, ep, intf, buff, timeout):
### !!!! changed address, length = buff.buffer_info()
address,length = getBufferInfo(buff)
##length *= buff.itemsize changed
----------------------------------
# in core.py
### !!!! changed address, length = buff.buffer_info()
address,length = getBufferInfo(buff)
##length *= buff.itemsize changed
----------------------------------
# in core.py
if isinstance(size_or_buffer,int):
------------------------------------------------------------------------------
_______________________________________________ pyusb-users mailing list pyusb-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/pyusb-users