Skip to content Skip to sidebar Skip to footer

Input Command Doesn't Seem To Work When Used With Popen Python

I am writing a small python application which executes scala commands. A user can insert the command through the STDIN and then the python app forwards them to the scala interprete

Solution 1:

You need to read all the lines from when the scala starts then input the command with a new line and get the two lines of output after:

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)
        ifnot line.strip():
            breakwhile True:
        command = input("Enter scala command >>> \n")
        scala.stdin.write(command+"\n")
        scala.stdin.flush()
        for line in scala.stdout:
            ifnot line.strip():
                breakprint(line)

An example run:

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+4res0: Int = 7

Enter scala command >>> 4 * 4
scala> 4 * 4res1: Int = 16

Enter scala command >>> 16 / 4
scala> 16 / 4res2: Int = 4

To get it to work from bash running it with unbuffer seems to sort out the output issues:

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)
        ifnot line.strip():
            breakwhile True:
        command = input("Enter scala command >>> ")
        scala.stdin.write(command+"\n")
        scala.stdout.flush()
        for line in scala.stdout:
            ifnot line.strip():
                breakprint(line)

If you are using Mac Os x, you should probably use :

with Popen(["script", "-q", "/dev/null", "scala"], stdout=PIPE, stdin=PIPE, bufsize=0, universal_newlines=True) as scala:

From bash:

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 :helpfor 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 >>> 

More info regarding shell buffer issues:

Post a Comment for "Input Command Doesn't Seem To Work When Used With Popen Python"