def read(self, size): if self._eof: raise SubprocessStreamEOFError if self._pos + size <= self._buf_len: buf = bytes(self._buf[self._pos:self._pos + size]) self._pos += size return buf else: size_left = size bio = BytesIO() while size_left: c = self._buf[self._pos:min(self._pos + size_left, self._buf_len)] bio.write(c) size_left -= len(c) self._pos += len(c) if size_left <= 0: break self._q_req.put(options.cupid.mp_buffer_size) recv_size = self._q_rep.get() if recv_size < 0: self._eof = True break self._buf_len = recv_size self._pos = 0 return bio.getvalue()
def read(self, size=-1): if Subprocess_StdIStream_eof(self._ptr): raise SubprocessStreamEOFError('Subprocess stream exhausted') if size < 0: buf_io = BytesIO() while True: try: chunk = self.read(READ_CHUNK) except SubprocessStreamEOFError: chunk = b'' buf_io.write(chunk) if len(chunk) < READ_CHUNK: break return buf_io.getvalue() else: p = create_string_buffer(size) Subprocess_StdIStream_read(self._ptr, p, size) return p.raw