class Spawn(BaseSpawn): def __init__(self, cmd): self.child = Popen(cmd, shell=True, stdout=PIPE, stdin=PIPE, preexec_fn=setsid, stderr=STDOUT, env=environ) self.stdout = Device(self.child.stdout) self.stdin = Device(self.child.stdin) def install_events(self): super(Spawn, self).install_events() Stdout(self.stdout) Stdin(self.stdin) self.stdout.add_map(LOAD, lambda con, data: \ self.output.append(data)) self.stdin.add_map(CLOSE, self.handle_close) self.stdout.add_map(CLOSE, self.handle_close) def dump_signal(self, num): killpg(self.child.pid, num) def terminate_process(self): self.child.kill() root.status.set_msg('Killed process!') def dump_line(self): data = self.input.get('insert linestart', 'insert +1l linestart') data = data.encode(self.input.charset) self.stdin.dump(data) self.input.down() def handle_close(self, dev, err): root.status.set_msg('Killed process!') self.stdout.destroy() self.stdin.destroy()
from untwisted import core from untwisted.core import Kill def on_close(dev, err): print('On CLOSE ...', err) dev.destroy() dev.close() raise Kill def on_load(dev, data): print('On LOAD ...', data) child = Popen(['python', '-i'], stdout=PIPE, stdin=PIPE, stderr=STDOUT) stdout = Device(child.stdout) stdin = Device(child.stdin) FileWriter(stdin) FileReader(stdout) stdin.dump(b'print("hello world!")\n') stdin.add_map(DUMPED, lambda dev: stdin.dump(b'quit()\n')) stdout.add_map(LOAD, on_load) stdin.add_map(CLOSE, on_close) stdout.add_map(CLOSE, on_close) core.gear.mainloop()