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: |