using bytearray with socket.recv_into

arrays, python-2.7, sockets

Solution

Use a `memoryview` to wrap your `bytearray`:

buf = bytearray(toread)
view = memoryview(buf)
while toread:
    nbytes = sock.recv_into(view, toread)
    view = view[nbytes:] # slicing views is cheap
    toread -= nbytes

Problem

I am doing some socket IO, and using a bytearray object as a buffer. I would like to receive data with an offset into this buffer using csock.recv_into as shown below in order to avoid creating intermediary string objects. Unfortunately, it seems bytearrays can't be used this way, and the code below doesn't work. ``` buf = bytearray(b" " * toread) read = 0 while(toread): nbytes = csock.recv_into(buf[read:],toread) toread -= nbytes read += nbytes ``` So instead I am using the code below, which does use a temporary string (and works)... ``` buf = bytearray(b" " * toread) read = 0 while(toread): tmp = csock.recv(toread) nbytes = len(tmp) buf[read:] = tmp toread -= nbytes read += nbytes ``` Is there a more elegant way to do this that doesn't require copying intermediate strings around?

Original source