X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=subproc.py;h=a0099c290db088a168181802ee91153ac2b920c9;hb=71900f3630cb51580964038b78100d60e3671981;hp=d9eba6151c1e0208c174f29cfe9494c11d3e9efb;hpb=e70621e769a50fdbe183092e4dd2c9dfda65bab5;p=bookmarks_db.git diff --git a/subproc.py b/subproc.py index d9eba61..a0099c2 100644 --- a/subproc.py +++ b/subproc.py @@ -135,22 +135,20 @@ class Subprocess: pid, err = os.waitpid(self.pid, os.WNOHANG) except os.error, (errno, msg): if errno == 10: - raise SubprocessError, \ - "Subprocess '%s' failed." % self.cmd - raise SubprocessError, \ - "Subprocess failed[%d]: %s" % (errno, msg) + raise SubprocessError("Subprocess '%s' failed." % self.cmd) + raise SubprocessError("Subprocess failed[%d]: %s" % (errno, msg)) if pid == self.pid: # child exited already self.pid == None sig = err & 0xff rc = (err & 0xff00) >> 8 if sig: - raise SubprocessError, ( + raise SubprocessError( "child killed by signal %d with a return code of %d" % (sig, rc)) if rc: - raise SubprocessError, \ - "child exited with return code %d" % rc + raise SubprocessError( + "child exited with return code %d" % rc) # Child may have exited, but not in error, so we won't say # anything more at this point. @@ -160,13 +158,13 @@ class Subprocess: """Write a STRING to the subprocess.""" if not self.pid: - raise SubprocessError, "no child" # ===> + raise SubprocessError("no child") # ===> if select.select([],self.toChild_fdlist,[],0)[1]: self.toChild.write(str) self.toChild.flush() else: # XXX Can write-buffer full be handled better?? - raise IOError, "write to %s blocked" % self # ===> + raise IOError("write to %s blocked" % self) # ===> def writeline(self, line=''): """Write STRING, with added newline termination, to subprocess.""" @@ -204,8 +202,9 @@ class Subprocess: return self.readPendingChars() got = '' while n: - got = got + self.readPendingChars(n) - n = n - len(got) + got0 = self.readPendingChars(n) + got = got + got0 + n = n - len(got0) return got def readPendingChars(self, max=None): """Read all currently pending subprocess output as a single string.""" @@ -216,7 +215,7 @@ class Subprocess: if self.control_stderr: return self.errbuf.readPendingChars() else: - raise SubprocessError, "Haven't grabbed subprocess error stream." + raise SubprocessError("Haven't grabbed subprocess error stream.") def readPendingLine(self): """Read currently pending subprocess output, up to a complete line @@ -228,7 +227,7 @@ class Subprocess: if self.control_stderr: return self.errbuf.readPendingLine() else: - raise SubprocessError, "Haven't grabbed subprocess error stream." + raise SubprocessError("Haven't grabbed subprocess error stream.") def readline(self): """Return next complete line of subprocess output, blocking until @@ -240,7 +239,7 @@ class Subprocess: if self.control_stderr: return self.errbuf.readline() else: - raise SubprocessError, "Haven't grabbed subprocess error stream." + raise SubprocessError("Haven't grabbed subprocess error stream.") ### Subprocess Control ### @@ -271,9 +270,9 @@ class Subprocess: os.kill(self.pid, signal.SIGSTOP) except os.error: if verbose: - print "Stop failed for '%s' - '%s'" % (self.cmd, sys.exc_value) + print("Stop failed for '%s' - '%s'" % (self.cmd, sys.exc_value)) return 0 - if verbose: print "Stopped '%s'" % self.cmd + if verbose: print("Stopped '%s'" % self.cmd) return 'stopped' def cont(self, verbose=0): @@ -283,10 +282,10 @@ class Subprocess: os.kill(self.pid, signal.SIGCONT) except os.error: if verbose: - print ("Continue failed for '%s' - '%s'" % - (self.cmd, sys.exc_value)) + print(("Continue failed for '%s' - '%s'" % + (self.cmd, sys.exc_value))) return 0 - if verbose: print "Continued '%s'" % self.cmd + if verbose: print("Continued '%s'" % self.cmd) return 'continued' def die(self): @@ -296,9 +295,9 @@ class Subprocess: SubprocessError is raised if process is not successfully killed.""" if not self.pid: - raise SubprocessError, "No process" # ===> + raise SubprocessError("No process") # ===> elif not self.cont(): - raise SubprocessError, "Can't signal subproc %s" % self # ===> + raise SubprocessError("Can't signal subproc %s" % self) # ===> # Try sending first a TERM and then a KILL signal. keep_trying = 1 @@ -314,18 +313,18 @@ class Subprocess: # WNOHANG == 1 on sunos, presumably same elsewhere. if os.waitpid(self.pid, os.WNOHANG): if self.expire_noisily: - print ("\n(%s subproc %d '%s' / %s)" % + print(("\n(%s subproc %d '%s' / %s)" % (sig[0], self.pid, self.cmd, - hex(id(self))[2:])) + hex(id(self))[2:]))) for i in self.pipefiles: os.close(i) self.pid = 0 return None # ===> time.sleep(.1) # Only got here if subprocess is not gone: - raise (SubprocessError, - ("Failed kill of subproc %d, '%s', with signals %s" % - (self.pid, self.cmd, map(lambda(x): x[0], sigs)))) + raise SubprocessError( + "Failed kill of subproc %d, '%s', with signals %s" % + (self.pid, self.cmd, map(lambda(x): x[0], sigs))) def __del__(self): """Terminate the subprocess""" @@ -507,8 +506,8 @@ class RecordFile: try: l = string.atoi(line) except ValueError: - raise IOError, ("corrupt %s file structure" - % self.__class__.__name__) + raise IOError(("corrupt %s file structure" + % self.__class__.__name__)) return f.read(l) else: # EOF. @@ -520,7 +519,7 @@ class RecordFile: if hasattr(f, attr): return getattr(f, attr) else: - raise AttributeError, attr + raise AttributeError(attr) def __repr__(self): return "<%s of %s at %s>" % (self.__class__.__name__, @@ -539,7 +538,7 @@ def record_trial(s): r = c.read() show = " start:\t %s\n end:\t %s\n" % (`s`, `r`) if r != s: - raise IOError, "String distorted:\n%s" % show + raise IOError("String distorted:\n%s" % show) ############################################################################# ##### An example subprocess interfaces ##### @@ -561,7 +560,7 @@ class Ph: try: self.proc = Subprocess('ph', 1) except: - raise SubprocessError, ('failure starting ph: %s' % # ===> + raise SubprocessError('failure starting ph: %s' % # ===> str(sys.exc_value)) def query(self, q): @@ -584,7 +583,7 @@ class Ph: if not response: return got # ===> elif type(response) == types.StringType: - raise ValueError, "ph failed match: '%s'" % response # ===> + raise ValueError("ph failed match: '%s'" % response) # ===> for line in response: # convert to a dict: line = string.splitfields(line, ':') @@ -602,7 +601,7 @@ class Ph: nextChar = self.proc.waitForPendingChar(60) if not nextChar: - raise SubprocessError, 'ph subprocess not responding' # ===> + raise SubprocessError('ph subprocess not responding') # ===> elif nextChar == '-': # dashed line - discard it, and continue reading: self.proc.readline() @@ -635,7 +634,7 @@ class Ph: got = string.splitfields(got, '\n')[-1] if got == 'ph> ': return # Ok. ===> time.sleep(pause) - raise SubprocessError, ('ph not responding within %s secs' % + raise SubprocessError('ph not responding within %s secs' % pause * maxIter) ############################################################################# @@ -643,41 +642,41 @@ class Ph: ############################################################################# def test(p=0): - print "\tOpening subprocess:" + print("\tOpening subprocess:") p = Subprocess('cat', 1) # set to expire noisily... - print p - print "\tOpening bogus subprocess, should fail:" + print(p) + print("\tOpening bogus subprocess, should fail:") try: b = Subprocess('/', 1) - print "\tOops! Null-named subprocess startup *succeeded*?!?" + print("\tOops! Null-named subprocess startup *succeeded*?!?") except SubprocessError: - print "\t...yep, it failed." - print '\tWrite, then read, two newline-teriminated lines, using readline:' + print("\t...yep, it failed.") + print('\tWrite, then read, two newline-teriminated lines, using readline:') p.write('first full line written\n'); p.write('second.\n') - print `p.readline()` - print `p.readline()` - print '\tThree lines, last sans newline, read using combination:' + print(`p.readline()`) + print(`p.readline()`) + print('\tThree lines, last sans newline, read using combination:') p.write('first\n'); p.write('second\n'); p.write('third, (no cr)') - print '\tFirst line via readline:' - print `p.readline()` - print '\tRest via readPendingChars:' - print p.readPendingChars() - print "\tStopping then continuing subprocess (verbose):" + print('\tFirst line via readline:') + print(`p.readline()`) + print('\tRest via readPendingChars:') + print(p.readPendingChars()) + print("\tStopping then continuing subprocess (verbose):") if not p.stop(1): # verbose stop - print '\t** Stop seems to have failed!' + print('\t** Stop seems to have failed!') else: - print '\tWriting line while subprocess is paused...' + print('\tWriting line while subprocess is paused...') p.write('written while subprocess paused\n') - print '\tNonblocking read of paused subprocess (should be empty):' - print p.readPendingChars() - print '\tContinuing subprocess (verbose):' + print('\tNonblocking read of paused subprocess (should be empty):') + print(p.readPendingChars()) + print('\tContinuing subprocess (verbose):') if not p.cont(1): # verbose continue - print '\t** Continue seems to have failed! Probly lost subproc...' + print('\t** Continue seems to have failed! Probly lost subproc...') return p else: - print '\tReading accumulated line, blocking read:' - print p.readline() - print "\tDeleting subproc, which was set to die noisily:" + print('\tReading accumulated line, blocking read:') + print(p.readline()) + print("\tDeleting subproc, which was set to die noisily:") del p - print "\tDone." + print("\tDone.") return None