Source code for pyparrot.utils.NonBlockingStreamReader

"""
A non-blocking stream reader (used to solve the process communciation with ffmpeg)

This code is almost directly from:

http://eyalarubas.com/python-subproc-nonblock.html

Amy McGovern (dramymcgovern@gmail.com) modified to allow the thread to end nicely
and also to not throw an error if the stream ends, since our code already will know that
from parsing (and the programs are not expected to run forever)
"""

from threading import Thread
from queue import Queue, Empty
import time

[docs]class NonBlockingStreamReader: def __init__(self, stream): ''' stream: the stream to read from. Usually a process' stdout or stderr. ''' self._s = stream self._q = Queue() self.is_running = True self._t = Thread(target = self._populateQueue, args = (self._s, self._q)) self._t.daemon = True self._t.start() #start collecting lines from the stream def _populateQueue(self, stream, queue): ''' Collect lines from 'stream' and put them in 'quque'. ''' while self.is_running: line = stream.readline() if line: queue.put(line) else: self.finish_reader() time.sleep(0.001)
[docs] def readline(self, timeout = None): try: return self._q.get(block = timeout is not None, timeout = timeout) except Empty: return None
[docs] def finish_reader(self): #print("Finishing the non-blocking reader") self.is_running = False
[docs]class UnexpectedEndOfStream(Exception): pass