I want to make python file which opens two programs. This two programs have to get input from each other multiple times. I opened two programs and know how to give input to one
To exchange messages via pipes dynamically (not tested):
#!/usr/bin/env python3
from subprocess import Popen, PIPE
with Popen('p1', stdin=PIPE, stdout=PIPE, universal_newlines=True) as p1, \
Popen('p2', stdin=PIPE, stdout=PIPE, universal_newlines=True) as p2:
# give_input(n)
print(n, file=p1.stdin, flush=True)
print(n, file=p2.stdin, flush=True)
for i in range(n):
# t_1 = get_output(t_2) //give input t_2, and get output t_1
print(p1.stdout.read(1), file=p2.stdin, flush=True)
# t_2 = get_output(t_1) //give input t_1, and get output t_2
print(p2.stdout.read(1), file=p1.stdin, flush=True)
It assumes that the child processes expect a line as a request and return a single character as a response.
To make it work:
p1
, p2
should disable their internal stdout
buffering (callsetvbuf(stdout, NULL, _IONBF, 0);
at the start of the program) or call fflush()
after each printf()
. Related: Python C program subprocess hangs at “for line in iter”p1
, p2
into $PATH
or pass a full path instead 'p1'
into Popen()
.