Hello!
Here's my implementation of a function that executes some command and
drains stdout/stderr invoking other functions for every line of
command output:

def __execute2_drain_pipe(queue, pipe):
        for line in pipe:
                queue.put(line)
        return

def execute2(command, out_filter = None, err_filter = None):
        p = subprocess.Popen(command , shell=True, stdin = subprocess.PIPE, \
                stdout = subprocess.PIPE, stderr = subprocess.PIPE, \
                env = os.environ)

        qo = Queue.Queue()
        qe = Queue.Queue()

        to = threading.Thread(target = __execute2_drain_pipe, \
                args = (qo, p.stdout))
        to.start()
        time.sleep(0)
        te = threading.Thread(target = __execute2_drain_pipe, \
                args = (qe, p.stderr))
        te.start()

        while to.isAlive() or te.isAlive():
                try:
                        line = qo.get()
                        if out_filter:
                                out_filter(line)
                        qo.task_done()
                except Queue.Empty:
                        pass

                try:
                        line = qe.get()
                        if err_filter:
                                err_filter(line)
                        qe.task_done()
                except Queue.Empty:
                        pass

        to.join()
        te.join()
        return p.wait()

Problem is my implementation is buggy and function hungs when there's
empty stdout/stderr. Can I have your feedback?
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to