Выполните подкоманду в 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 и запустить в ней приложение.