2012年10月6日土曜日

python - 他のプログラムの標準出力を監視する


ブロックしないようにタイムアウト付きの入力を使って
スレッドで時間経過を監視…しているけど、別にスレッド使う必要はなかったような。
少し前に書いた物なので意図を忘れてしまった。

import os
import sys
import time
import threading
import select

startTime = time.time()
endTime = startTime

def inputWithTimeout(timeout_time):
    i, o, e = select.select([sys.stdin], [], [], timeout_time)
    if (i):
        return sys.stdin.readline().strip()
    else:
        return None

def printUsage():
    print 'python ' + os.path.basename(__file__) + ' [KEYWORD] [TIMEOUT(S)]'

def timeoutMonitorWorker():
    timeout = False
    while not timeout:
        now = time.time()
        if now > endTime:
            timeout = True
        try:
            time.sleep(1)
        except KeyboardInterrupt:
            timeout = True
         
if __name__ == '__main__':
    argv = sys.argv
    argc = len(argv)
 
    if argc != 3:
        print printUsage()
        sys.exit(1)
 
    endTime += int(argv[2])
 
    timeOutMonitorThread = threading.Thread(target=timeoutMonitorWorker)
    timeOutMonitorThread.daemon = True
    timeOutMonitorThread.start()
 
    while True:
        try:
            if not timeOutMonitorThread.isAlive():
                print 'Monitor : Timeout...'
                sys.exit(-1)
            stdInput = inputWithTimeout(1)
            if stdInput == "":
                print 'EOF Detected...'
                sys.exit(-1)
            if stdInput == None:
                continue
            print stdInput
            if stdInput == argv[1]:
                print 'Monitor : ' + 'Keyword [%s] found' % argv[1]
                sys.exit()
        except EOFError:
            print 'Monitor : EOF detected...'
            sys.exit(-1)

0 件のコメント:

コメントを投稿