Esempio n. 1
0
 def loop(self):
     while True:
         self.handle_gui_events(self.sock)
         funcname, args = recv_object(self.sock)
         if funcname in rpc_funcs:
             func = getattr(self, funcname)
             try:
                 r = func(*args)
                 if isinstance(r, types.GeneratorType):
                     for obj in r:
                         send_object(self.sock, obj)
                 else:
                     send_object(self.sock, r)
             except Exception:
                 # This may help in debugging exceptions.
                 traceback.print_exc()
                 send_object(self.sock, None)
         else:
             # aid in debug
             print >> sys.stderr, "Unknown command: %s" % funcname
             send_object(self.sock, None)
Esempio n. 2
0
 def loop(self):
     while True:
         if not self.idle_paused:
             self.handle_gui_events(self.sock)
         funcname, args = recv_object(self.sock)
         if funcname in rpc_funcs:
             func = getattr(self, funcname)
             try:
                 r = func(*args)
                 if isinstance(r, types.GeneratorType):
                     for obj in r:
                         send_object(self.sock, obj)
                 else:
                     send_object(self.sock, r)
             except Exception:
                 # This may help in debugging exceptions.
                 traceback.print_exc()
                 send_object(self.sock, None)
         else:
             # aid in debug
             sys.stderr.write("Unknown command: %s\n" % funcname)
             send_object(self.sock, None)
Esempio n. 3
0
def main():
    if len(sys.argv) < 2 or sys.argv[1] in ('-h', '--help'):
        print >> sys.stderr, "Usage: %s executable" % sys.argv[0]
        sys.exit(1)
    executable = sys.argv[1:]
    
    # Find a socket to listen to
    ports = range(10000, 10100)
    random.shuffle(ports)
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    for port in ports:
        debug("Trying to listen on port %d..." % port)
        try:
            s.bind(('localhost', port))
        except socket.error:
            debug("Failed.")
            pass
        else:
            debug("Ok.")
            break
    else:
        raise IOError("Couldn't find a port to bind to")
    # Now the socket is bound to port.

    debug("Spawning subprocess")
    env = os.environ.copy()
    env['PYTHONUNBUFFERED'] = '1'
    popen = Popen(executable + [str(port)],
                  stdin=PIPE, stdout=PIPE, #stderr=PIPE,
                  close_fds=True, env=env)
    debug("Waiting for an answer")
    s.listen(1)
    sock, addr = s.accept()
    debug("Connected to addr %r!" % (addr,))
    s.close()

    # Start the play
    while True:
        time.sleep(0.01)

        # Check if exited
        rc = popen.poll()
        if rc is not None:
            print 'Process terminated with rc %r' % rc
            break

        # Read from stdout, stderr, and socket
        #ready, _, _ = select([sys.stdin, popen.stdout, popen.stderr, sock], [], [], 0)
        ready, _, _ = select([sys.stdin, popen.stdout, sock], [], [], 0)

        if sys.stdin in ready:
            line = sys.stdin.readline()
            if not line:
                break
            obj = eval(line)
            send_object(sock, obj)

        if popen.stdout in ready:
            r = []
            while True:
                r.append(os.read(popen.stdout.fileno(), 8192))
                if not select([popen.stdout], [], [], 0)[0]:
                    break
            r = ''.join(r)
            print 'stdout: %r' % r
                
        if popen.stderr in ready:
            r = []
            while True:
                r.append(os.read(popen.stderr.fileno(), 8192))
                if not select([popen.stderr], [], [], 0)[0]:
                    break
            r = ''.join(r)
            print 'stderr: %r' % r
        
        if sock in ready:
            obj = recv_object(sock)
            print 'obj: %r' % (obj,)