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
- import os, io
- from threading import Thread
- import Queue
- 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:
- os.environ["PYTHONUNBUFFERED"]="1"
- try:
- p = Popen( argv + ["-sub-"],
- bufsize=0, # line-buffered
- stdin=PIPE, stdout=PIPE, stderr=PIPE )
- except WindowsError, W:
- if W.winerror==193:
- p = Popen( argv + ["-sub-"],
- shell=True, # Try to run via shell
- bufsize=0, # line-buffered
- stdin=PIPE, stdout=PIPE, stderr=PIPE )
- else:
- raise
- inp = Queue.Queue()
- sout = io.open(p.stdout.fileno(), 'rb', closefd=False)
- serr = io.open(p.stderr.fileno(), 'rb', closefd=False)
- def rOut():
- while True:
- part_line = sout.peek(io.DEFAULT_BUFFER_SIZE)
- if len(part_line)>0:
- inp.put( ('stdout', sout.read(len(part_line)) ) )
- else:
- return
- def rErr():
- while True:
- part_line = serr.peek(io.DEFAULT_BUFFER_SIZE)
- if len(part_line)>0:
- inp.put( ('stderr', serr.read(len(part_line)) ) )
- else:
- return
- thOut = Thread(target=rOut)
- thOut.setDaemon(True)
- thOut.start()
- thErr = Thread(target=rErr)
- thErr.setDaemon(True)
- thErr.start()
- while p.poll() is None:
- # App still working
- try:
- chan,line = inp.get(timeout = 1.0)
- if chan=='stdout':
- print "STDOUT>>", line, "<?<"
- elif chan=='stderr':
- print " ERROR==", line, "=?="
- except Queue.Empty:
- pass
- print "Finish"
- if __name__ == '__main__':
- __main__()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement