@@ -40,7 +40,8 @@ class TimeoutException(Exception):
40
40
class Command :
41
41
"""
42
42
wrapper for synchronous execution of commands via subprocess.Popen()
43
- and getting their output (stderr is redirected to stdout) and return value
43
+ and getting their output (stderr is redirected to stdout by default)
44
+ and exit value
44
45
"""
45
46
46
47
# state definitions
@@ -51,7 +52,7 @@ class Command:
51
52
52
53
def __init__ (self , cmd , args_subst = None , args_append = None , logger = None ,
53
54
excl_subst = False , work_dir = None , env_vars = None , timeout = None ,
54
- redirect_stderr = True , resource_limits = None ):
55
+ redirect_stderr = True , resource_limits = None , doprint = False ):
55
56
self .cmd = cmd
56
57
self .state = "notrun"
57
58
self .excl_subst = excl_subst
@@ -61,6 +62,7 @@ def __init__(self, cmd, args_subst=None, args_append=None, logger=None,
61
62
self .pid = None
62
63
self .redirect_stderr = redirect_stderr
63
64
self .limits = resource_limits
65
+ self .doprint = doprint
64
66
65
67
self .logger = logger or logging .getLogger (__name__ )
66
68
logging .basicConfig ()
@@ -144,13 +146,16 @@ class OutputThread(threading.Thread):
144
146
stdout/stderr buffers fill up.
145
147
"""
146
148
147
- def __init__ (self , event , logger ):
149
+ def __init__ (self , event , logger , doprint = False ):
148
150
super (OutputThread , self ).__init__ ()
149
151
self .read_fd , self .write_fd = os .pipe ()
150
152
self .pipe_fobj = os .fdopen (self .read_fd , encoding = 'utf8' )
151
153
self .out = []
152
154
self .event = event
153
155
self .logger = logger
156
+ self .doprint = doprint
157
+
158
+ # Start the thread now.
154
159
self .start ()
155
160
156
161
def run (self ):
@@ -169,6 +174,9 @@ def run(self):
169
174
170
175
self .out .append (line )
171
176
177
+ if self .doprint :
178
+ print (line .strip ())
179
+
172
180
def getoutput (self ):
173
181
return self .out
174
182
@@ -199,15 +207,17 @@ def close(self):
199
207
200
208
timeout_thread = None
201
209
output_event = threading .Event ()
202
- output_thread = OutputThread (output_event , self .logger )
210
+ output_thread = OutputThread (output_event , self .logger ,
211
+ doprint = self .doprint )
203
212
204
213
# If stderr redirection is off, setup a thread that will capture
205
214
# stderr data.
206
215
if self .redirect_stderr :
207
216
stderr_dest = subprocess .STDOUT
208
217
else :
209
218
stderr_event = threading .Event ()
210
- stderr_thread = OutputThread (stderr_event , self .logger )
219
+ stderr_thread = OutputThread (stderr_event , self .logger ,
220
+ doprint = self .doprint )
211
221
stderr_dest = stderr_thread
212
222
213
223
try :
@@ -217,9 +227,8 @@ def close(self):
217
227
except PermissionError :
218
228
pass
219
229
self .logger .debug ("command = {}" .format (self .cmd ))
220
- my_args = {}
221
- my_args ['stderr' ] = stderr_dest
222
- my_args ['stdout' ] = output_thread
230
+ my_args = {'stderr' : stderr_dest ,
231
+ 'stdout' : output_thread }
223
232
if self .env_vars :
224
233
my_env = os .environ .copy ()
225
234
my_env .update (self .env_vars )
0 commit comments