Вы должны прочитать все строки из когда Скала начинает затем ввести команду с новой строки и получить две строки вывода после того, как:
from subprocess import Popen, PIPE
with Popen(["scala"], stdout=PIPE, stdin=PIPE, bufsize=0, universal_newlines=True) as scala:
for line in scala.stdout:
print(line)
if not line.strip():
break
while True:
command = input("Enter scala command >>> \n")
scala.stdin.write(command+"\n")
scala.stdin.flush()
for line in scala.stdout:
if not line.strip():
break
print(line)
пример запуска:
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_60).
Type in expressions to have them evaluated.
Type :help for more information.
Enter scala command >>> 3+4
scala> 3+4
res0: Int = 7
Enter scala command >>> 4 * 4
scala> 4 * 4
res1: Int = 16
Enter scala command >>> 16/4
scala> 16/4
res2: Int = 4
чтобы заставить его работать с Баш, запуская его с unbuffer, кажется, разобраться в выходные вопросы:
from subprocess import Popen, PIPE
with Popen(["unbuffer", "-p","scala"], stdout=PIPE, stdin=PIPE, bufsize=0, universal_newlines=True) as scala:
for line in scala.stdout:
print(line)
if not line.strip():
break
while True:
command = input("Enter scala command >>> ")
scala.stdin.write(command+"\n")
scala.stdout.flush()
for line in scala.stdout:
if not line.strip():
break
print(line)
Если вы используете Mac OS X, вы, вероятно, следует использовать:
with Popen(["script", "-q", "/dev/null", "scala"], stdout=PIPE, stdin=PIPE, bufsize=0, universal_newlines=True) as scala:
От Баш:
print(line)
## -- End pasted text --
Welcome to Scala version 2.11.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_60).
Type in expressions to have them evaluated.
Type :help for more information.
Enter scala command >>> 4 + 2
scala> 4 + 2
res0: Int = 6
Enter scala command >>> 4 * 12
scala> 4 * 12
res1: Int = 48
Enter scala command >>> 100 // 25
scala> 100 // 25
res2: Int = 100
Enter scala command >>>
Более подробную информацию о оболочки буферные вопросы:
ли работу скрипта, если вы жестко закодировать 'command' вместо чтения его с' input'? – Barmar
@ Бармар Да, он делает. Я жестко программирую «4 + 5» как команду, и интерпретатор возвращает правильный результат. –
'scala' может буферизировать свой вывод. – Barmar