def _wait4process(self): if self._outputs_processed: return def remove_ending_lf(s): if s.endswith('\n'): return s[:-1] else: return s if self.popen: if self.use_temp_files: if USE_POLL: while 1: if self.popen.poll() is not None: break if self._stop_thread: return time.sleep(POLL_TIME) else: # wait() blocks process, timeout not possible self.popen.wait() self._outputs_processed = True self._stdout_file.seek(0) self._stderr_file.seek(0) self.stdout = self._stdout_file.read() self.stderr = self._stderr_file.read() self._stdout_file.close() self._stderr_file.close() else: # This will deadlock when using stdout=PIPE and/or stderr=PIPE # and the child process generates enough output to a pipe such # that it blocks waiting for the OS pipe buffer to accept more data. # Use communicate() to avoid that. #self.popen.wait() #self.stdout = self.popen.stdout.read() #self.stderr = self.popen.stderr.read() # communicate() blocks process, timeout not possible self._outputs_processed = True (self.stdout, self.stderr) = self.popen.communicate() log.debug('process has ended') self.stdout = unidecode(self.stdout) self.stderr = unidecode(self.stderr) #self.stdout = remove_ending_lf(unidecode(self.stdout)) # Commented out by Dmitri #self.stderr = remove_ending_lf(unidecode(self.stderr)) # Commented out by Dmitri log.debug('return code=' + str(self.return_code)) # def limit_str(s): # if len(s) > self.max_bytes_to_log: # warn = '[middle of output was removed, max_bytes_to_log=%s]'%(self.max_bytes_to_log) # s = s[:self.max_bytes_to_log / 2] + warn + s[-self.max_bytes_to_log / 2:] # return s log.debug('stdout=' + (self.stdout)) log.debug('stderr=' + (self.stderr))
def _wait4process(self): if self._outputs_processed: return def remove_ending_lf(s): if s.endswith('\n'): return s[:-1] else: return s if self.popen: if self.use_temp_files: if USE_POLL: while 1: if self.popen.poll() is not None: break if self._stop_thread: return time.sleep(POLL_TIME) else: # wait() blocks process, timeout not possible self.popen.wait() self._outputs_processed = True self._stdout_file.seek(0) self._stderr_file.seek(0) self.stdout = self._stdout_file.read() self.stderr = self._stderr_file.read() self._stdout_file.close() self._stderr_file.close() else: # This will deadlock when using stdout=PIPE and/or stderr=PIPE # and the child process generates enough output to a pipe such # that it blocks waiting for the OS pipe buffer to accept more data. # Use communicate() to avoid that. # self.popen.wait() # self.stdout = self.popen.stdout.read() # self.stderr = self.popen.stderr.read() # communicate() blocks process, timeout not possible self._outputs_processed = True (self.stdout, self.stderr) = self.popen.communicate() log.debug('process has ended') self.stdout = remove_ending_lf(unidecode(self.stdout)) self.stderr = remove_ending_lf(unidecode(self.stderr)) log.debug('return code=' + str(self.return_code)) # def limit_str(s): # if len(s) > self.max_bytes_to_log: # warn = '[middle of output was removed, max_bytes_to_log=%s]'%(self.max_bytes_to_log) # s = s[:self.max_bytes_to_log / 2] + warn + s[-self.max_bytes_to_log / 2:] # return s log.debug('stdout=' + (self.stdout)) log.debug('stderr=' + (self.stderr))