def run(self): try: if self.logger: self.logger.debug("%s : execute command %s" % (as_unicode(self.log_prefix), as_unicode(self.command))) except: # на случай если в комманде возникнет UNICODE/DECODE error # может быть в случае передачи русских символов например в пути if self.logger: self.logger.error("%s : Error when write log" % (as_unicode(self.log_prefix))) command = [as_default_string(item) for item in self.command] self.process = subprocess.Popen(command, **self.process_options)
def iterate(self): try: if self.logger: self.logger.debug("%s : iterate command %s" % (as_unicode(self.log_prefix), as_unicode(self.command))) except Exception as e: # на случай если в комманде возникнет UNICODE/DECODE error # может быть в случае передачи русских символов например в пути if self.logger: self.logger.error("%s : Error when write log: %s" % (as_unicode(self.log_prefix), str(e))) def enqueue_output(out, queue): for line in iter(out.readline, ""): queue.put(as_unicode(line).rstrip("\n")) out.close() def enqueue_errors(err, queue): for line in iter(err.readline, ""): queue.put(as_unicode(line).rstrip('\n')) err.close() command = [as_default_string(item) for item in self.command] self.process = subprocess.Popen(command, **self.process_options) q_out = Queue() q_err = Queue() t_out = Thread(target=enqueue_output, args=(self.process.stdout, q_out)) t_out.daemon = True t_out.start() t_err = Thread(target=enqueue_errors, args=(self.process.stderr, q_err)) t_err.daemon = True t_err.start() while True: if not q_err.empty(): err_output = q_err.get() else: err_output = "" if err_output != "": if self.logger: self.logger.error("%s : Error: %s" % (as_unicode(self.log_prefix), as_unicode(err_output))) raise Exception(err_output) if not q_out.empty(): line_output = q_out.get() else: line_output = "" code = self.process.poll() if self.logger and line_output != "": try: self.logger.debug( "%s : command iterate: %s" % (as_unicode(self.log_prefix), as_unicode(line_output))) except Exception as e: # на случай если в комманде возникнет UNICODE/DECODE error # может быть в случае передачи русских символов например в пути self.logger.error( "%s : Error when write command iterate log: %s" % (as_unicode(self.log_prefix), str(e))) if line_output == "": if code is not None: self.logger.debug("%s : command iterate end" % as_unicode(self.log_prefix)) break yield line_output