1

Issue

I am communicating with a terminal application (xfoil) and I want to isolate the stdout corresponding to each stdin. This question is also more general as I wish to know why I can't open an application with subprocess, and then use successively its stdin and stdout (or rather how could I do it).

What I can do now

As of now, I can send instructions to Xfoil using process.communicate which retrieves the entire stdout.

import subprocess
xfoil = subprocess.Popen('path_to_xfoil.exe', stdin=subprocess.PIPE, \
                         stdout=subprocess.PIPE, stderr=subprocess.PIPE)
[output, _] = xfoil.communicate(input=instructions)

What I want to achieve

Instead of having to deal with the entire stdout, I wish to isolate each set of instructions (stdin) and results (stdout). Something in the lines of:

output1 = process.communicate(input=instructions1)
output2 = process.communicate(input=instructions2)
output3 = process.communicate(input=instructions3)
...

I need the process to stay open (which is not the case with communicate).

What I have attempted

Communicate multiple times with a process without breaking the pipe? is probably the way to go, however it does not explain clearly how to read the output, and the following piece of code simply freezes, probably because I have no idea when read should stop.

xfoil.stdin.write(instructions1)
xfoil.stdout.read()  # never passes this line
xfoil.stdin.write(instructions2)
xfoil.stdout.read()

Non-blocking read on a subprocess.PIPE in python seemed a good path as well, however it only takes care of output.

Or perhaps I need to use the os module as in ipc - communicate multiple times with a subprocess in Python ?

Thank you for your help

PS: I read a tiny bit about fcntl but I need the code to work on both Linux and Windows.

Arkangus
  • 76
  • 7
  • Does this help: https://stackoverflow.com/questions/2715847/read-streaming-input-from-subprocess-communicate? – NPE Apr 05 '19 at 08:22
  • Attempted that as well, it freezes when I intend to read xfoil.stdout (with ``for line in xfoil.stdout: print(line, end='')``). – Arkangus Apr 05 '19 at 08:26

0 Answers0