util/ProcessLogger.py
changeset 1784 64beb9e9c749
parent 1780 c52d1460cea8
child 1831 56b48961cc68
--- a/util/ProcessLogger.py	Mon Aug 21 20:17:19 2017 +0000
+++ b/util/ProcessLogger.py	Mon Aug 21 23:22:58 2017 +0300
@@ -22,11 +22,13 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
+import os
+import sys
 import time
 import wx
-import subprocess, ctypes
+import subprocess
+import ctypes
 from threading import Timer, Lock, Thread, Semaphore
-import os, sys
 if os.name == 'posix':
     from signal import SIGTERM, SIGKILL
 
@@ -48,36 +50,39 @@
     def run(self):
         outchunk = None
         self.retval = None
-        while self.retval is None and not self.killed :
+        while self.retval is None and not self.killed:
             if self.endcallback:
                 self.retval = self.Proc.poll()
             else:
                 self.retval = self.Proc.returncode
-                
+
             outchunk = self.fd.readline()
-            if self.callback : self.callback(outchunk)
-        while outchunk != '' and not self.killed :
+            if self.callback:
+                self.callback(outchunk)
+        while outchunk != '' and not self.killed:
             outchunk = self.fd.readline()
-            if self.callback : self.callback(outchunk)
+            if self.callback:
+                self.callback(outchunk)
         if self.endcallback:
             try:
                 err = self.Proc.wait()
-            except:
+            except Exception:
                 err = self.retval
             self.finished = True
             self.endcallback(self.Proc.pid, err)
 
+
 class ProcessLogger:
-    def __init__(self, logger, Command, finish_callback = None,
-                 no_stdout = False, no_stderr = False, no_gui = True,
-                 timeout = None, outlimit = None, errlimit = None,
-                 endlog = None, keyword = None, kill_it = False, cwd = None,
-                 encoding = None):
+    def __init__(self, logger, Command, finish_callback=None,
+                 no_stdout=False, no_stderr=False, no_gui=True,
+                 timeout=None, outlimit=None, errlimit=None,
+                 endlog=None, keyword=None, kill_it=False, cwd=None,
+                 encoding=None):
         self.logger = logger
         if not isinstance(Command, list):
             self.Command_str = Command
             self.Command = []
-            for i,word in enumerate(Command.replace("'",'"').split('"')):
+            for i, word in enumerate(Command.replace("'", '"').split('"')):
                 if i % 2 == 0:
                     word = word.strip()
                     if len(word) > 0:
@@ -108,17 +113,18 @@
         self.errdata = []
         self.keyword = keyword
         self.kill_it = kill_it
-        self.startsem = Semaphore(0)        
+        self.startsem = Semaphore(0)
         self.finishsem = Semaphore(0)
         self.endlock = Lock()
 
-        popenargs= {
-               "cwd":os.getcwd() if cwd is None else cwd,
-               "stdin":subprocess.PIPE,
-               "stdout":subprocess.PIPE,
-               "stderr":subprocess.PIPE}
-
-        if no_gui == True and wx.Platform == '__WXMSW__':
+        popenargs = {
+               "cwd":    os.getcwd() if cwd is None else cwd,
+               "stdin":  subprocess.PIPE,
+               "stdout": subprocess.PIPE,
+               "stderr": subprocess.PIPE
+        }
+
+        if no_gui and wx.Platform == '__WXMSW__':
             self.startupinfo = subprocess.STARTUPINFO()
             self.startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
             popenargs["startupinfo"] = self.startupinfo
@@ -126,12 +132,12 @@
             popenargs["shell"] = False
 
         if timeout:
-            self.timeout = Timer(timeout,self.endlog)
+            self.timeout = Timer(timeout, self.endlog)
             self.timeout.start()
         else:
             self.timeout = None
-            
-        self.Proc = subprocess.Popen( self.Command, **popenargs )
+
+        self.Proc = subprocess.Popen(self.Command, **popenargs)
 
         self.outt = outputThread(
                       self.Proc,
@@ -147,16 +153,15 @@
         self.errt.start()
         self.startsem.release()
 
-
-    def output(self,v):
+    def output(self, v):
         self.outdata.append(v)
         self.outlen += 1
         if not self.no_stdout:
             self.logger.write(v)
-        if (self.keyword and v.find(self.keyword)!=-1) or (self.outlimit and self.outlen > self.outlimit):
+        if (self.keyword and v.find(self.keyword) != -1) or (self.outlimit and self.outlen > self.outlimit):
             self.endlog()
 
-    def errors(self,v):
+    def errors(self, v):
         self.errdata.append(v)
         self.errlen += 1
         if not self.no_stderr:
@@ -164,28 +169,28 @@
         if self.errlimit and self.errlen > self.errlimit:
             self.endlog()
 
-    def log_the_end(self,ecode,pid):
+    def log_the_end(self, ecode, pid):
         self.logger.write(self.Command_str + "\n")
-        self.logger.write_warning(_("exited with status {a1} (pid {a2})\n").format(a1 = str(ecode), a2 = str(pid)))
-
-    def finish(self, pid,ecode):
-        # avoid running function before start is finished        
+        self.logger.write_warning(_("exited with status {a1} (pid {a2})\n").format(a1=str(ecode), a2=str(pid)))
+
+    def finish(self, pid, ecode):
+        # avoid running function before start is finished
         self.startsem.acquire()
         if self.timeout:
             self.timeout.cancel()
         self.exitcode = ecode
         if self.exitcode != 0:
-            self.log_the_end(ecode,pid)
+            self.log_the_end(ecode, pid)
         if self.finish_callback is not None:
-            self.finish_callback(self,ecode,pid)
+            self.finish_callback(self, ecode, pid)
         self.errt.join()
         self.finishsem.release()
 
-    def kill(self,gently=True):
+    def kill(self, gently=True):
         # avoid running kill before start is finished
         self.startsem.acquire()
         self.startsem.release()
-        
+
         self.outt.killed = True
         self.errt.killed = True
         if wx.Platform == '__WXMSW__':
@@ -195,12 +200,12 @@
             ctypes.windll.kernel32.CloseHandle(handle)
         else:
             if gently:
-                sig=SIGTERM
+                sig = SIGTERM
             else:
-                sig=SIGKILL
+                sig = SIGKILL
             try:
                 os.kill(self.Proc.pid, sig)
-            except:
+            except Exception:
                 pass
         self.outt.join()
         self.errt.join()
@@ -208,11 +213,9 @@
     def endlog(self):
         if self.endlock.acquire(False):
             if not self.outt.finished and self.kill_it:
-               self.kill()
+                self.kill()
             self.finishsem.release()
 
-
     def spin(self):
         self.finishsem.acquire()
         return [self.exitcode, "".join(self.outdata), "".join(self.errdata)]
-