util/ProcessLogger.py
changeset 1883 20ec80d6fd70
parent 1882 3707240447f8
child 1919 ccea0fa6ea91
equal deleted inserted replaced
1882:3707240447f8 1883:20ec80d6fd70
    76 class ProcessLogger(object):
    76 class ProcessLogger(object):
    77     def __init__(self, logger, Command, finish_callback=None,
    77     def __init__(self, logger, Command, finish_callback=None,
    78                  no_stdout=False, no_stderr=False, no_gui=True,
    78                  no_stdout=False, no_stderr=False, no_gui=True,
    79                  timeout=None, outlimit=None, errlimit=None,
    79                  timeout=None, outlimit=None, errlimit=None,
    80                  endlog=None, keyword=None, kill_it=False, cwd=None,
    80                  endlog=None, keyword=None, kill_it=False, cwd=None,
    81                  encoding=None):
    81                  encoding=None, output_encoding=None):
    82         self.logger = logger
    82         self.logger = logger
    83         if not isinstance(Command, list):
    83         if not isinstance(Command, list):
    84             self.Command_str = Command
    84             self.Command_str = Command
    85             self.Command = []
    85             self.Command = []
    86             for i, word in enumerate(Command.replace("'", '"').split('"')):
    86             for i, word in enumerate(Command.replace("'", '"').split('"')):
    93         else:
    93         else:
    94             self.Command = Command
    94             self.Command = Command
    95             self.Command_str = subprocess.list2cmdline(self.Command)
    95             self.Command_str = subprocess.list2cmdline(self.Command)
    96 
    96 
    97         fsencoding = sys.getfilesystemencoding()
    97         fsencoding = sys.getfilesystemencoding()
       
    98         self.output_encoding = output_encoding
    98 
    99 
    99         if encoding is None:
   100         if encoding is None:
   100             encoding = fsencoding
   101             encoding = fsencoding
   101         self.Command = [self.Command[0].encode(fsencoding)]+map(
   102         self.Command = [self.Command[0].encode(fsencoding)]+map(
   102             lambda x: x.encode(encoding), self.Command[1:])
   103             lambda x: x.encode(encoding), self.Command[1:])
   153             self.errors)
   154             self.errors)
   154         self.errt.start()
   155         self.errt.start()
   155         self.startsem.release()
   156         self.startsem.release()
   156 
   157 
   157     def output(self, v):
   158     def output(self, v):
       
   159         if v and self.output_encoding:
       
   160             v = v.decode(self.output_encoding)
   158         self.outdata.append(v)
   161         self.outdata.append(v)
   159         self.outlen += 1
   162         self.outlen += 1
   160         if not self.no_stdout:
   163         if not self.no_stdout:
   161             self.logger.write(v)
   164             self.logger.write(v)
   162         if (self.keyword and v.find(self.keyword) != -1) or (self.outlimit and self.outlen > self.outlimit):
   165         if (self.keyword and v.find(self.keyword) != -1) or (self.outlimit and self.outlen > self.outlimit):
   163             self.endlog()
   166             self.endlog()
   164 
   167 
   165     def errors(self, v):
   168     def errors(self, v):
       
   169         if v and self.output_encoding:
       
   170             v = v.decode(self.output_encoding)
   166         self.errdata.append(v)
   171         self.errdata.append(v)
   167         self.errlen += 1
   172         self.errlen += 1
   168         if not self.no_stderr:
   173         if not self.no_stderr:
   169             self.logger.write_warning(v)
   174             self.logger.write_warning(v)
   170         if self.errlimit and self.errlen > self.errlimit:
   175         if self.errlimit and self.errlen > self.errlimit: