Python : Communication With C++ Command Line Program Not Working When Using
I have the following python code, which is supposed to provide the intial input to a C++ program, then take its output and feed it back into it, until the program finishes executio
Solution 1:
It is caused by the fact that std::endl
flushes the ostream
and printf
does not flush stdout
,
as you can see by amending test__2.cpp
as follows:
#include<cstdio>intmain(){
for( int i = 0; i < 3; ++i )
{
int n;
scanf("%d", &n);
printf("%d\n", n+1);
fflush(stdout); //<-- add this
}
return0;
}
You say that you want to module to work correctly with any C++ program, so you can't rely upon it flushing the standard output (or standard error) after every write.
That means you must cause the program's standard streams to be unbuffered
and do so externally to the program itself. You will need to do that
in comm.py
.
In Linux (or other host providing GNU Core Utils), you could so by
executing the program via stdbuf
, e.g.
import subprocess
cmd = ['/usr/bin/stdbuf', '-i0','-o0', '-e0', './test__2']
p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=False)
p.stdin.flush()
p.stdout.flush()
x = b'1\n'while True:
p.stdin.write(x)
x = p.stdout.readline()
print(x)
if p.poll() != None:
break
which unbuffers all the standard streams. For Windows, you will need to research how do the same thing. For the time being I don't know.
Post a Comment for "Python : Communication With C++ Command Line Program Not Working When Using"