Выполните подкоманду в Scala (скрипт) и дайте ей "завладеть"

Я хотел бы создать фиктивный скрипт (с возможностью написания реального сценария), который вызывает, например, интерактивный интерпретатор Python из процесса Scala и позволяет пользователю полностью взаимодействовать с подпроцессом; т. е. stdin/stdout/stderr дочернего процесса должен быть связан с родительским процессом (Scala). Я попытался использовать следующее безрезультатно:

#!/usr/bin/env scala -savecompiled

import sys.process._

stringToProcess("python").run(BasicIO.standard(connectInput = true)).exitValue

Тем не менее, хотя он, кажется, успешно запустить python Подпроцесс, единственное взаимодействие, которое я получаю, это Ctrl-C:

~$ ./scalashelltest.scala
foo

^CTraceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyboardInterrupt

Если сразу нажать Ctrl-C, я даже не получу такой вывод:

~$ ./scalashelltest.scala
^C~$ 

Любая идея, почему это происходит и как заставить это работать как ожидалось?

1 ответ

Решение

Вы не даете Python (псевдо) Tty. Вы просто даете ему стандартный ввод (и, возможно, стандартный вывод).

Таким образом, python работает в неинтерактивном режиме.

Запуск питона с -i flag заставит его использовать приглашения даже без tty, но более корректное исправление, скорее всего, найдет библиотеку scala/java, которая может создать (псевдо)tty и запустить в ней приложение.

Другие вопросы по тегам