#!/usr/bin/env python APPLICATION = "wc" HOST, PORT = "localhost", 0 import sys, subprocess, re import socket, threading, SocketServer class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): process = False ansisequence = re.compile(r'\x1B\[[^A-Za-z]*[A-Za-z]') def handle(self): while (True): data = self.request.recv (1024); cur_thread = threading.currentThread() response = "%s: %s" % (cur_thread.getName(), data) self.request.send ("%s\n" % str(response)) self.process.stdin.write (data); line = self.process.stdout.readline () while (len(line) > 2): output = self.ansisequence.sub ("" , str(line)) self.request.send ("%s\n" % str(output)) line = self.process.stdout.readline () class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass if __name__ == "__main__": server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) ip, port = server.server_address # Start a thread with the server -- that thread will then start one # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates server_thread.setDaemon(True) server_thread.start() print "Started daemon: %d" % port p = subprocess.Popen([APPLICATION], stdin=subprocess.PIPE, stdout=subprocess.PIPE) ThreadedTCPRequestHandler.process = p server.serve_forever ()