@@ -49,14 +49,16 @@ class Command:
49
49
TIMEDOUT = "timed out"
50
50
51
51
def __init__ (self , cmd , args_subst = None , args_append = None , logger = None ,
52
- excl_subst = False , work_dir = None , env_vars = None , timeout = None ):
52
+ excl_subst = False , work_dir = None , env_vars = None , timeout = None ,
53
+ redirect_stderr = True ):
53
54
self .cmd = cmd
54
55
self .state = "notrun"
55
56
self .excl_subst = excl_subst
56
57
self .work_dir = work_dir
57
58
self .env_vars = env_vars
58
59
self .timeout = timeout
59
60
self .pid = None
61
+ self .redirect_stderr = redirect_stderr
60
62
61
63
self .logger = logger or logging .getLogger (__name__ )
62
64
logging .basicConfig ()
@@ -167,8 +169,18 @@ def close(self):
167
169
return
168
170
169
171
timeout_thread = None
170
- event = threading .Event ()
171
- output_thread = OutputThread (event , self .logger )
172
+ output_event = threading .Event ()
173
+ output_thread = OutputThread (output_event , self .logger )
174
+
175
+ # If stderr redirection is off, setup a thread that will capture
176
+ # stderr data.
177
+ if self .redirect_stderr :
178
+ stderr_dest = subprocess .STDOUT
179
+ else :
180
+ stderr_event = threading .Event ()
181
+ stderr_thread = OutputThread (stderr_event , self .logger )
182
+ stderr_dest = stderr_thread
183
+
172
184
try :
173
185
start_time = time .time ()
174
186
try :
@@ -179,10 +191,10 @@ def close(self):
179
191
if self .env_vars :
180
192
my_env = os .environ .copy ()
181
193
my_env .update (self .env_vars )
182
- p = subprocess .Popen (self .cmd , stderr = subprocess . STDOUT ,
194
+ p = subprocess .Popen (self .cmd , stderr = stderr_dest ,
183
195
stdout = output_thread , env = my_env )
184
196
else :
185
- p = subprocess .Popen (self .cmd , stderr = subprocess . STDOUT ,
197
+ p = subprocess .Popen (self .cmd , stderr = stderr_dest ,
186
198
stdout = output_thread )
187
199
188
200
self .pid = p .pid
@@ -226,9 +238,15 @@ def close(self):
226
238
# exit the read loop we have to close it here ourselves.
227
239
output_thread .close ()
228
240
self .logger .debug ("Waiting on output thread to finish reading" )
229
- event .wait ()
230
-
241
+ output_event .wait ()
231
242
self .out = output_thread .getoutput ()
243
+
244
+ if not self .redirect_stderr :
245
+ stderr_thread .close ()
246
+ self .logger .debug ("Waiting on stderr thread to finish reading" )
247
+ stderr_event .wait ()
248
+ self .err = stderr_thread .getoutput ()
249
+
232
250
elapsed_time = time .time () - start_time
233
251
self .logger .debug ("Command {} took {} seconds" .
234
252
format (self .cmd , int (elapsed_time )))
@@ -286,6 +304,9 @@ def getoutput(self):
286
304
else :
287
305
return None
288
306
307
+ def geterroutput (self ):
308
+ return self .err
309
+
289
310
def getstate (self ):
290
311
return self .state
291
312
0 commit comments