Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
 async def writeline(self, event, data=''):
     self._proc.stdin.write((encode(event, data) + '\n').encode('utf-8'))
     self._proc.stdin.drain()
Exemplo n.º 5
0
 def read(self, size=-1):
     print(encode(Event.INP), file=self.out, flush=True)
     return decode(self.inp.readline())
Exemplo n.º 6
0
 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)