def timeout_read(self, fd, timeout): timer = Timer(timeout) try: data = fd.recv(10024) except Interrupted: data = None else: timer.stop() return data
class Interpreter(object): def __init__(self, python, timeout=TIMEOUT, kill_timeout=KILL_TIMEOUT): pipe = subprocess.Popen([python, "-u", "-i"], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True, bufsize=0) self.pipe = pipe self.read_fd = FDInput(self.pipe.stdout.fileno(), close=False) self.pid = pipe.pid self.timeout = timeout #self.kill_timeout = kill_timeout self.giver, accepter = meetingpoint() autogreenlet(self.timeout_kill, accepter, kill_timeout) #self.last_activity = time.time() def timeout_kill(self, accepter, timeout): while 1: try: self.kill_timer = Timer(timeout) accepter.accept() self.kill_timer.stop() except Interrupted: self.close() return def timeout_read(self, fd, timeout): timer = Timer(timeout) try: data = fd.recv(10024) except Interrupted: data = None else: timer.stop() return data def write_only(self, to_write): if to_write is not None: self.giver.give(42) self.pipe.stdin.write(to_write) def interact(self, to_write=None): self.write_only(to_write) return self.timeout_read(self.read_fd, self.timeout) def close(self): self.pipe.stdin.close() # XXX: some sane way of doing wait here? (note that wait # is blocking, which means it eats all our clean interface) self.pipe.wait() __del__ = close