def run(interp, code): try: print(encode(Events.STARTED), flush=True) interp.run(code) _send_noint() except KeyboardInterrupt: # At most one keyboard interrupt is promised to be sent after STARTED # (and 0 before STARTED) pass print(encode(Events.DONE), flush=True)
def _send_noint(): # Send no interrupts request and expect to get an ack s = signal.getsignal(signal.SIGINT) try: signal.signal(signal.SIGINT, _noop) print(encode(Events.NOINT), flush=True) key, _ = decode(next(sys.stdin)) assert key == Events.NOINT finally: signal.signal(signal.SIGINT, s)
def repl(): io = IO(sys.stdin, sys.stdout) files = [ io, WriterWrapper(io, Events.OUT), WriterWrapper(io, Events.ERR), WriterWrapper(io, Events.HTML) ] interpreter = Interpreter(files, _log) for line in sys.stdin: event, code = decode(line) if event == Events.RUN: run(interpreter, code) elif event == Events.PATH: interpreter.change_path(json.loads(code)) elif event == Events.PING: print(encode(Events.PONG), flush=True) elif event == Events.FORK: pid = fork() print(encode(Events.FORKED, str(pid)), flush=True) else: print(encode(Events.EXC, 'Unkown event %s' % event), flush=True)
async def writeline(self, event, data=''): self._proc.stdin.write((encode(event, data) + '\n').encode('utf-8')) self._proc.stdin.drain()
def read(self, size=-1): print(encode(Event.INP), file=self.out, flush=True) return decode(self.inp.readline())
def write(self, event, data, urgent=False): _log.debug('Writing', event, data) _log.debug('Length', event, len(data)) print(encode(event, data), file=self.out, flush=urgent)