Advertisement
datacompboy

Catch output/error from sub-process ASAP

Jun 11th, 2013
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.38 KB | None | 0 0
  1. #!/usr/bin/python
  2. #
  3. # Runner with stdout/stderr catcher
  4. #
  5. from sys import argv
  6. from subprocess import Popen, PIPE
  7. from select import select
  8. def __main__():
  9.     if (len(argv) > 1) and (argv[1] == "-sub-"):
  10.         import time, sys
  11.         print "Application runned!"
  12.         time.sleep(2)
  13.         print "Slept 2 second"
  14.         time.sleep(1)
  15.         print "Slept 1 additional second",
  16.         time.sleep(2)
  17.         sys.stderr.write("Stderr output after 5 seconds")
  18.         print "Eol on stdin"
  19.         sys.stderr.write("Eol on stderr\n")
  20.         time.sleep(1)
  21.         print "Wow, we have end of work!",
  22.     else:
  23.         import os, io
  24.         os.environ["PYTHONUNBUFFERED"]="1"
  25.         p = Popen( [argv[0], "-sub-"]+argv[1:],
  26.                    bufsize=0, # line-buffered
  27.                    stdin=PIPE, stdout=PIPE, stderr=PIPE )
  28.         sout = io.open(p.stdout.fileno(), 'rb', closefd=False)
  29.         serr = io.open(p.stderr.fileno(), 'rb', closefd=False)
  30.         while p.poll() is None:
  31.             # App still working
  32.             (rd, _, _) = select([p.stdout, p.stderr], [], [p.stdout, p.stderr], 1.0)
  33.             print "select:", rd, _
  34.             if len(rd)>0:
  35.                 for r in rd:
  36.                     if r==p.stdout:
  37.                         while '\n' in sout.peek(io.DEFAULT_BUFFER_SIZE):
  38.                             line = sout.readline()
  39.                             print "STDOUT>>", line, "<!<"
  40.                         part_line = sout.peek(io.DEFAULT_BUFFER_SIZE)
  41.                         if len(part_line)>0:
  42.                             part_line = sout.read(len(part_line))
  43.                             print "STDOUT>>", part_line, "<?<"
  44.                     elif r==p.stderr:
  45.                         while '\n' in serr.peek(io.DEFAULT_BUFFER_SIZE):
  46.                             line = serr.readline()
  47.                             print " ERROR==", line, "=!="
  48.                         part_line = serr.peek(io.DEFAULT_BUFFER_SIZE)
  49.                         if len(part_line)>0:
  50.                             part_line = sout.read(len(part_line))
  51.                             print " ERROR==", part_line, "=?="
  52.         line = sout.read()
  53.         if len(line)>0:
  54.             print "STDOUT>>", line, "<-<"
  55.         line = serr.read()
  56.         if len(line)>0:
  57.             print " ERROR==", line, "=-="
  58.         print "Finish"
  59.  
  60. if __name__ == '__main__':
  61.     __main__()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement