P2 and P3 subprocess stdout seem to have very odd/different behaviours in the face of mixing select and buffering. Use raw/low-level IO (os.read) with select to try and fix that up. Also read more than one byte at a time since os.read will not block *if* the fd is readable, it will just get whatever data is immediately available.