##// END OF EJS Templates
First cut of subprocess execution with redirection of stdin/stdout.
First cut of subprocess execution with redirection of stdin/stdout.

File last commit:

r1437:c515254c
r1437:c515254c
Show More
piped_process.py
48 lines | 1.6 KiB | text/x-python | PythonLexer
# encoding: utf-8
"""
Object for encapsulating process execution by using callbacks for stdout,
stderr and stdin.
"""
__docformat__ = "restructuredtext en"
#-------------------------------------------------------------------------------
# Copyright (C) 2008 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
# Imports
#-------------------------------------------------------------------------------
from subprocess import Popen, PIPE
from threading import Thread
class PipedProcess(Thread):
def __init__(self, command_string, out_callback,
end_callback=None,):
self.command_string = command_string
self.out_callback = out_callback
self.end_callback = end_callback
Thread.__init__(self)
def run(self):
""" Start the process and hook up the callbacks.
"""
process = Popen((self.command_string + ' 2>&1', ), shell=True,
universal_newlines=True,
stdout=PIPE, stdin=PIPE)
self.process = process
while True:
out_char = process.stdout.read(1)
if out_char == '' and process.poll() is not None:
break
self.out_callback(out_char)
if self.end_callback is not None:
self.end_callback()