@@ -181,9 +181,9 @@ def __init__(
181181 self , command , stdin = None , timeout = None , ignore_error = False , parse = False , stdout_file_path = None , stderr_file_path = None , env = {}
182182 ):
183183 # Write data to tmp file to avoid PIPEs and execution blocking
184- stdin_file = tempfile .TemporaryFile (mode = "w+" )
185- stdin_file .write (stdin )
186- stdin_file .seek (0 )
184+ self . stdin_file = tempfile .TemporaryFile (mode = "w+" )
185+ self . stdin_file .write (stdin )
186+ self . stdin_file .seek (0 )
187187 self .stdout_file = tempfile .TemporaryFile () if stdout_file_path is None else stdout_file_path
188188 self .stderr_file = tempfile .TemporaryFile () if stderr_file_path is None else stderr_file_path
189189 self .ignore_error = ignore_error
@@ -196,7 +196,7 @@ def __init__(
196196 env ["TSAN_OPTIONS" ] = "use_sigaltstack=0 verbosity=0"
197197 self .process = sp .Popen (
198198 command ,
199- stdin = stdin_file ,
199+ stdin = self . stdin_file ,
200200 stdout = self .stdout_file ,
201201 stderr = self .stderr_file ,
202202 env = env ,
@@ -225,13 +225,24 @@ def remove_trash_from_stderr(self, stderr):
225225 ]
226226 return "\n " .join (lines )
227227
228- def get_answer (self ):
229- self .process .wait (timeout = DEFAULT_QUERY_TIMEOUT )
230- self .stdout_file .seek (0 )
231- self .stderr_file .seek (0 )
228+ def wait_and_read_output (self ):
229+ try :
230+ self .process .wait (timeout = DEFAULT_QUERY_TIMEOUT )
231+ self .stdout_file .seek (0 )
232+ self .stderr_file .seek (0 )
233+
234+ stdout = self .stdout_file .read ().decode ("utf-8" , errors = "replace" )
235+ stderr = self .stderr_file .read ().decode ("utf-8" , errors = "replace" )
232236
233- stdout = self .stdout_file .read ().decode ("utf-8" , errors = "replace" )
234- stderr = self .stderr_file .read ().decode ("utf-8" , errors = "replace" )
237+ return stdout , stderr
238+
239+ finally :
240+ self .stdin_file .close ()
241+ self .stdout_file .close ()
242+ self .stderr_file .close ()
243+
244+ def get_answer (self ):
245+ stdout , stderr = self .wait_and_read_output ()
235246
236247 if (
237248 self .timer is not None
@@ -264,12 +275,7 @@ def get_answer(self):
264275 return stdout
265276
266277 def get_error (self ):
267- self .process .wait (timeout = DEFAULT_QUERY_TIMEOUT )
268- self .stdout_file .seek (0 )
269- self .stderr_file .seek (0 )
270-
271- stdout = self .stdout_file .read ().decode ("utf-8" , errors = "replace" )
272- stderr = self .stderr_file .read ().decode ("utf-8" , errors = "replace" )
278+ stdout , stderr = self .wait_and_read_output ()
273279
274280 if (
275281 self .timer is not None
@@ -288,12 +294,7 @@ def get_error(self):
288294 return stderr
289295
290296 def get_answer_and_error (self ):
291- self .process .wait (timeout = DEFAULT_QUERY_TIMEOUT )
292- self .stdout_file .seek (0 )
293- self .stderr_file .seek (0 )
294-
295- stdout = self .stdout_file .read ().decode ("utf-8" , errors = "replace" )
296- stderr = self .stderr_file .read ().decode ("utf-8" , errors = "replace" )
297+ stdout , stderr = self .wait_and_read_output ()
297298
298299 if (
299300 self .timer is not None
0 commit comments