diff --git a/kittens/runner.py b/kittens/runner.py index bb560dfc5..92f933ece 100644 --- a/kittens/runner.py +++ b/kittens/runner.py @@ -50,15 +50,26 @@ def launch(args): os.environ['KITTY_CONFIG_DIRECTORY'] = config_dir from kittens.tui.operations import clear_screen, reset_mode m = import_kitten_main_module(config_dir, kitten) - result = m['start'](args) + try: + result = m['start'](args) + finally: + sys.stdin = sys.__stdin__ print(reset_mode('ALTERNATE_SCREEN') + clear_screen(), end='') if result is not None: import json - print('OK:', json.dumps(result)) + data = json.dumps(result) + print('OK:', len(data), data) sys.stderr.flush() sys.stdout.flush() +def deserialize(output): + import json + if output.startswith('OK: '): + prefix, sz, rest = output.split(' ', 2) + return json.loads(rest[:int(sz)]) + + def run_kitten(kitten): import runpy kitten = resolved_kitten(kitten) diff --git a/kitty/boss.py b/kitty/boss.py index d60f92151..3c0bf2420 100644 --- a/kitty/boss.py +++ b/kitty/boss.py @@ -498,7 +498,7 @@ class Boss: SpecialWindow( ['kitty', '+runpy', 'from kittens.runner import main; main()'] + args, stdin=data, - env={'KITTY_COMMON_OPTS': json.dumps(copts)}, + env={'KITTY_COMMON_OPTS': json.dumps(copts), 'PYTHONWARNINGS': 'ignore'}, overlay_for=w.id)) overlay_window.action_on_close = partial(self.on_kitten_finish, w.id, end_kitten) @@ -510,8 +510,9 @@ class Boss: def on_kitten_finish(self, target_window_id, end_kitten, source_window): output = self.get_output(source_window, num_lines=None) - if output.startswith('OK: '): - data = json.loads(output.partition(' ')[2].strip()) + from kittens.runner import deserialize + data = deserialize(output) + if data is not None: end_kitten(data, target_window_id, self) def input_unicode_character(self):