114 self.startsem = Semaphore(0) |
114 self.startsem = Semaphore(0) |
115 self.finishsem = Semaphore(0) |
115 self.finishsem = Semaphore(0) |
116 self.endlock = Lock() |
116 self.endlock = Lock() |
117 |
117 |
118 popenargs= { |
118 popenargs= { |
119 "cwd":os.getcwd() if cwd is None else cwd, |
119 "cwd": os.getcwd() if cwd is None else cwd, |
120 "stdin":subprocess.PIPE, |
120 "stdin": subprocess.PIPE, |
121 "stdout":subprocess.PIPE, |
121 "stdout": subprocess.PIPE, |
122 "stderr":subprocess.PIPE} |
122 "stderr": subprocess.PIPE |
|
123 } |
123 |
124 |
124 if no_gui == True and wx.Platform == '__WXMSW__': |
125 if no_gui == True and wx.Platform == '__WXMSW__': |
125 self.startupinfo = subprocess.STARTUPINFO() |
126 self.startupinfo = subprocess.STARTUPINFO() |
126 self.startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW |
127 self.startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW |
127 popenargs["startupinfo"] = self.startupinfo |
128 popenargs["startupinfo"] = self.startupinfo |
128 elif wx.Platform == '__WXGTK__': |
129 elif wx.Platform == '__WXGTK__': |
129 popenargs["shell"] = False |
130 popenargs["shell"] = False |
130 |
131 |
131 if timeout: |
132 if timeout: |
132 self.timeout = Timer(timeout,self.endlog) |
133 self.timeout = Timer(timeout, self.endlog) |
133 self.timeout.start() |
134 self.timeout.start() |
134 else: |
135 else: |
135 self.timeout = None |
136 self.timeout = None |
136 |
137 |
137 self.Proc = subprocess.Popen( self.Command, **popenargs ) |
138 self.Proc = subprocess.Popen( self.Command, **popenargs ) |
149 self.errors) |
150 self.errors) |
150 self.errt.start() |
151 self.errt.start() |
151 self.startsem.release() |
152 self.startsem.release() |
152 |
153 |
153 |
154 |
154 def output(self,v): |
155 def output(self, v): |
155 self.outdata.append(v) |
156 self.outdata.append(v) |
156 self.outlen += 1 |
157 self.outlen += 1 |
157 if not self.no_stdout: |
158 if not self.no_stdout: |
158 self.logger.write(v) |
159 self.logger.write(v) |
159 if (self.keyword and v.find(self.keyword)!=-1) or (self.outlimit and self.outlen > self.outlimit): |
160 if (self.keyword and v.find(self.keyword)!=-1) or (self.outlimit and self.outlen > self.outlimit): |
160 self.endlog() |
161 self.endlog() |
161 |
162 |
162 def errors(self,v): |
163 def errors(self, v): |
163 self.errdata.append(v) |
164 self.errdata.append(v) |
164 self.errlen += 1 |
165 self.errlen += 1 |
165 if not self.no_stderr: |
166 if not self.no_stderr: |
166 self.logger.write_warning(v) |
167 self.logger.write_warning(v) |
167 if self.errlimit and self.errlen > self.errlimit: |
168 if self.errlimit and self.errlen > self.errlimit: |
168 self.endlog() |
169 self.endlog() |
169 |
170 |
170 def log_the_end(self,ecode,pid): |
171 def log_the_end(self, ecode, pid): |
171 self.logger.write(self.Command_str + "\n") |
172 self.logger.write(self.Command_str + "\n") |
172 self.logger.write_warning(_("exited with status {a1} (pid {a2})\n").format(a1 = str(ecode), a2 = str(pid))) |
173 self.logger.write_warning(_("exited with status {a1} (pid {a2})\n").format(a1 = str(ecode), a2 = str(pid))) |
173 |
174 |
174 def finish(self, pid,ecode): |
175 def finish(self, pid, ecode): |
175 # avoid running function before start is finished |
176 # avoid running function before start is finished |
176 self.startsem.acquire() |
177 self.startsem.acquire() |
177 if self.timeout: |
178 if self.timeout: |
178 self.timeout.cancel() |
179 self.timeout.cancel() |
179 self.exitcode = ecode |
180 self.exitcode = ecode |
180 if self.exitcode != 0: |
181 if self.exitcode != 0: |
181 self.log_the_end(ecode,pid) |
182 self.log_the_end(ecode, pid) |
182 if self.finish_callback is not None: |
183 if self.finish_callback is not None: |
183 self.finish_callback(self,ecode,pid) |
184 self.finish_callback(self, ecode, pid) |
184 self.errt.join() |
185 self.errt.join() |
185 self.finishsem.release() |
186 self.finishsem.release() |
186 |
187 |
187 def kill(self,gently=True): |
188 def kill(self, gently=True): |
188 # avoid running kill before start is finished |
189 # avoid running kill before start is finished |
189 self.startsem.acquire() |
190 self.startsem.acquire() |
190 self.startsem.release() |
191 self.startsem.release() |
191 |
192 |
192 self.outt.killed = True |
193 self.outt.killed = True |