Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python
- #
- # Runner with stdout/stderr catcher
- #
- from sys import argv
- from subprocess import Popen, PIPE
- from select import select
- def __main__():
- if (len(argv) > 1) and (argv[1] == "-sub-"):
- import time, sys
- print "Application runned!"
- time.sleep(2)
- print "Slept 2 second"
- time.sleep(1)
- print "Slept 1 additional second",
- time.sleep(2)
- sys.stderr.write("Stderr output after 5 seconds")
- print "Eol on stdin"
- sys.stderr.write("Eol on stderr\n")
- time.sleep(1)
- print "Wow, we have end of work!",
- else:
- import os, io
- os.environ["PYTHONUNBUFFERED"]="1"
- p = Popen( [argv[0], "-sub-"]+argv[1:],
- bufsize=0, # line-buffered
- stdin=PIPE, stdout=PIPE, stderr=PIPE )
- sout = io.open(p.stdout.fileno(), 'rb', closefd=False)
- serr = io.open(p.stderr.fileno(), 'rb', closefd=False)
- while p.poll() is None:
- # App still working
- (rd, _, _) = select([p.stdout, p.stderr], [], [p.stdout, p.stderr], 1.0)
- print "select:", rd, _
- if len(rd)>0:
- for r in rd:
- if r==p.stdout:
- while '\n' in sout.peek(io.DEFAULT_BUFFER_SIZE):
- line = sout.readline()
- print "STDOUT>>", line, "<!<"
- part_line = sout.peek(io.DEFAULT_BUFFER_SIZE)
- if len(part_line)>0:
- part_line = sout.read(len(part_line))
- print "STDOUT>>", part_line, "<?<"
- elif r==p.stderr:
- while '\n' in serr.peek(io.DEFAULT_BUFFER_SIZE):
- line = serr.readline()
- print " ERROR==", line, "=!="
- part_line = serr.peek(io.DEFAULT_BUFFER_SIZE)
- if len(part_line)>0:
- part_line = sout.read(len(part_line))
- print " ERROR==", part_line, "=?="
- line = sout.read()
- if len(line)>0:
- print "STDOUT>>", line, "<-<"
- line = serr.read()
- if len(line)>0:
- print " ERROR==", line, "=-="
- print "Finish"
- if __name__ == '__main__':
- __main__()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement