##// END OF EJS Templates
Fix error in test decorator.
Fix error in test decorator.

File last commit:

r1506:ec6e67fd
r1577:44a45452
Show More
pipedprocess.py
74 lines | 2.5 KiB | text/x-python | PythonLexer
Gael Varoquaux
First cut of subprocess execution with redirection of stdin/stdout.
r1437 # 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
#-------------------------------------------------------------------------------
gvaroquaux
Clean up code, names, and docstrings.
r1455 from killableprocess import Popen, PIPE
Gael Varoquaux
First cut of subprocess execution with redirection of stdin/stdout.
r1437 from threading import Thread
Gael Varoquaux
Better traceback support.
r1439 from time import sleep
Gael Varoquaux
Make it more probably to get colors in shell commands.
r1506 import os
Gael Varoquaux
First cut of subprocess execution with redirection of stdin/stdout.
r1437
class PipedProcess(Thread):
Gael Varoquaux
More tests for frontends.
r1457 """ Class that encapsulates process execution by using callbacks for
stdout, stderr and stdin, and providing a reliable way of
killing it.
"""
Gael Varoquaux
First cut of subprocess execution with redirection of stdin/stdout.
r1437
def __init__(self, command_string, out_callback,
end_callback=None,):
Gael Varoquaux
More tests for frontends.
r1457 """ command_string: the command line executed to start the
process.
out_callback: the python callable called on stdout/stderr.
end_callback: an optional callable called when the process
finishes.
These callbacks are called from a different thread as the
thread from which is started.
"""
Gael Varoquaux
First cut of subprocess execution with redirection of stdin/stdout.
r1437 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.
"""
Gael Varoquaux
Make it more probably to get colors in shell commands.
r1506 env = os.environ
env['TERM'] = 'xterm'
Gael Varoquaux
First cut of subprocess execution with redirection of stdin/stdout.
r1437 process = Popen((self.command_string + ' 2>&1', ), shell=True,
Gael Varoquaux
Make it more probably to get colors in shell commands.
r1506 env=env,
Gael Varoquaux
First cut of subprocess execution with redirection of stdin/stdout.
r1437 universal_newlines=True,
Gael Varoquaux
Proper redirection of keystrokes to subprocesses.
r1450 stdout=PIPE, stdin=PIPE, )
Gael Varoquaux
First cut of subprocess execution with redirection of stdin/stdout.
r1437 self.process = process
while True:
out_char = process.stdout.read(1)
Gael Varoquaux
Better traceback support.
r1439 if out_char == '':
if process.poll() is not None:
# The process has finished
break
else:
# The process is not giving any interesting
# output. No use polling it immediatly.
sleep(0.1)
else:
self.out_callback(out_char)
Gael Varoquaux
First cut of subprocess execution with redirection of stdin/stdout.
r1437
if self.end_callback is not None:
self.end_callback()